home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / lib / mathlib / libblas / test / zblat2.f < prev    next >
Encoding:
Text File  |  1994-08-02  |  113.4 KB  |  3,250 lines

  1.       PROGRAM ZBLAT2
  2. *
  3. *  Test program for the COMPLEX*16       Level 2 Blas.
  4. *
  5. *  The program must be driven by a short data file. The first 18 records
  6. *  of the file are read using list-directed input, the last 17 records
  7. *  are read using the format ( A6, L2 ). An annotated example of a data
  8. *  file can be obtained by deleting the first 3 characters from the
  9. *  following 35 lines:
  10. *  'ZBLAT2.SUMM'     NAME OF SUMMARY OUTPUT FILE
  11. *  6                 UNIT NUMBER OF SUMMARY FILE
  12. *  'CBLA2T.SNAP'     NAME OF SNAPSHOT OUTPUT FILE
  13. *  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)
  14. *  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.
  15. *  F        LOGICAL FLAG, T TO STOP ON FAILURES.
  16. *  T        LOGICAL FLAG, T TO TEST ERROR EXITS.
  17. *  16.0     THRESHOLD VALUE OF TEST RATIO
  18. *  6                 NUMBER OF VALUES OF N
  19. *  0 1 2 3 5 9       VALUES OF N
  20. *  4                 NUMBER OF VALUES OF K
  21. *  0 1 2 4           VALUES OF K
  22. *  4                 NUMBER OF VALUES OF INCX AND INCY
  23. *  1 2 -1 -2         VALUES OF INCX AND INCY
  24. *  3                 NUMBER OF VALUES OF ALPHA
  25. *  (0.0,0.0) (1.0,0.0) (0.7,-0.9)       VALUES OF ALPHA
  26. *  3                 NUMBER OF VALUES OF BETA
  27. *  (0.0,0.0) (1.0,0.0) (1.3,-1.1)       VALUES OF BETA
  28. *  ZGEMV  T PUT F FOR NO TEST. SAME COLUMNS.
  29. *  ZGBMV  T PUT F FOR NO TEST. SAME COLUMNS.
  30. *  ZHEMV  T PUT F FOR NO TEST. SAME COLUMNS.
  31. *  ZHBMV  T PUT F FOR NO TEST. SAME COLUMNS.
  32. *  ZHPMV  T PUT F FOR NO TEST. SAME COLUMNS.
  33. *  ZTRMV  T PUT F FOR NO TEST. SAME COLUMNS.
  34. *  ZTBMV  T PUT F FOR NO TEST. SAME COLUMNS.
  35. *  ZTPMV  T PUT F FOR NO TEST. SAME COLUMNS.
  36. *  ZTRSV  T PUT F FOR NO TEST. SAME COLUMNS.
  37. *  ZTBSV  T PUT F FOR NO TEST. SAME COLUMNS.
  38. *  ZTPSV  T PUT F FOR NO TEST. SAME COLUMNS.
  39. *  ZGERC  T PUT F FOR NO TEST. SAME COLUMNS.
  40. *  ZGERU  T PUT F FOR NO TEST. SAME COLUMNS.
  41. *  ZHER   T PUT F FOR NO TEST. SAME COLUMNS.
  42. *  ZHPR   T PUT F FOR NO TEST. SAME COLUMNS.
  43. *  ZHER2  T PUT F FOR NO TEST. SAME COLUMNS.
  44. *  ZHPR2  T PUT F FOR NO TEST. SAME COLUMNS.
  45. *
  46. *     See:
  47. *
  48. *        Dongarra J. J., Du Croz J. J., Hammarling S.  and Hanson R. J..
  49. *        An  extended  set of Fortran  Basic Linear Algebra Subprograms.
  50. *
  51. *        Technical  Memoranda  Nos. 41 (revision 3) and 81,  Mathematics
  52. *        and  Computer Science  Division,  Argonne  National Laboratory,
  53. *        9700 South Cass Avenue, Argonne, Illinois 60439, US.
  54. *
  55. *        Or
  56. *
  57. *        NAG  Technical Reports TR3/87 and TR4/87,  Numerical Algorithms
  58. *        Group  Ltd.,  NAG  Central  Office,  256  Banbury  Road, Oxford
  59. *        OX2 7DE, UK,  and  Numerical Algorithms Group Inc.,  1101  31st
  60. *        Street,  Suite 100,  Downers Grove,  Illinois 60515-1263,  USA.
  61. *
  62. *
  63. *  -- Written on 10-August-1987.
  64. *     Richard Hanson, Sandia National Labs.
  65. *     Jeremy Du Croz, NAG Central Office.
  66. *
  67. *     .. Parameters ..
  68.       INTEGER            NIN
  69.       PARAMETER          ( NIN = 5 )
  70.       INTEGER            NSUBS
  71.       PARAMETER          ( NSUBS = 17 )
  72.       COMPLEX*16         ZERO, ONE
  73.       PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),
  74.      $                   ONE = ( 1.0D0, 0.0D0 ) )
  75.       DOUBLE PRECISION   RZERO, RHALF, RONE
  76.       PARAMETER          ( RZERO = 0.0D0, RHALF = 0.5D0, RONE = 1.0D0 )
  77.       INTEGER            NMAX, INCMAX
  78.       PARAMETER          ( NMAX = 65, INCMAX = 2 )
  79.       INTEGER            NINMAX, NIDMAX, NKBMAX, NALMAX, NBEMAX
  80.       PARAMETER          ( NINMAX = 7, NIDMAX = 9, NKBMAX = 7,
  81.      $                   NALMAX = 7, NBEMAX = 7 )
  82. *     .. Local Scalars ..
  83.       DOUBLE PRECISION   EPS, ERR, THRESH
  84.       INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NINC, NKB,
  85.      $                   NOUT, NTRA
  86.       LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,
  87.      $                   TSTERR
  88.       CHARACTER*1        TRANS
  89.       CHARACTER*6        SNAMET
  90.       CHARACTER*32       SNAPS, SUMMRY
  91. *     .. Local Arrays ..
  92.       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ),
  93.      $                   ALF( NALMAX ), AS( NMAX*NMAX ), BET( NBEMAX ),
  94.      $                   X( NMAX ), XS( NMAX*INCMAX ),
  95.      $                   XX( NMAX*INCMAX ), Y( NMAX ),
  96.      $                   YS( NMAX*INCMAX ), YT( NMAX ),
  97.      $                   YY( NMAX*INCMAX ), Z( 2*NMAX )
  98.       DOUBLE PRECISION   G( NMAX )
  99.       INTEGER            IDIM( NIDMAX ), INC( NINMAX ), KB( NKBMAX )
  100.       LOGICAL            LTEST( NSUBS )
  101.       CHARACTER*6        SNAMES( NSUBS )
  102. *     .. External Functions ..
  103.       DOUBLE PRECISION   DDIFF
  104.       LOGICAL            LZE
  105.       EXTERNAL           DDIFF, LZE
  106. *     .. External Subroutines ..
  107.       EXTERNAL           ZCHK1, ZCHK2, ZCHK3, ZCHK4, ZCHK5, ZCHK6,
  108.      $                   ZCHKE, ZMVCH
  109. *     .. Intrinsic Functions ..
  110.       INTRINSIC          ABS, MAX, MIN
  111. *     .. Scalars in Common ..
  112.       INTEGER            INFOT, NOUTC
  113.       LOGICAL            LERR, OK
  114.       CHARACTER*6        SRNAMT
  115. *     .. Common blocks ..
  116.       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
  117.       COMMON             /SRNAMC/SRNAMT
  118. *     .. Data statements ..
  119.       DATA               SNAMES/'ZGEMV ', 'ZGBMV ', 'ZHEMV ', 'ZHBMV ',
  120.      $                   'ZHPMV ', 'ZTRMV ', 'ZTBMV ', 'ZTPMV ',
  121.      $                   'ZTRSV ', 'ZTBSV ', 'ZTPSV ', 'ZGERC ',
  122.      $                   'ZGERU ', 'ZHER  ', 'ZHPR  ', 'ZHER2 ',
  123.      $                   'ZHPR2 '/
  124. *     .. Executable Statements ..
  125. *
  126. *     Read name and unit number for summary output file and open file.
  127. *
  128.       READ( NIN, FMT = * )SUMMRY
  129.       READ( NIN, FMT = * )NOUT
  130.       OPEN( NOUT, FILE = SUMMRY, STATUS = 'NEW' )
  131.       NOUTC = NOUT
  132. *
  133. *     Read name and unit number for snapshot output file and open file.
  134. *
  135.       READ( NIN, FMT = * )SNAPS
  136.       READ( NIN, FMT = * )NTRA
  137.       TRACE = NTRA.GE.0
  138.       IF( TRACE )THEN
  139.          OPEN( NTRA, FILE = SNAPS, STATUS = 'NEW' )
  140.       END IF
  141. *     Read the flag that directs rewinding of the snapshot file.
  142.       READ( NIN, FMT = * )REWI
  143.       REWI = REWI.AND.TRACE
  144. *     Read the flag that directs stopping on any failure.
  145.       READ( NIN, FMT = * )SFATAL
  146. *     Read the flag that indicates whether error exits are to be tested.
  147.       READ( NIN, FMT = * )TSTERR
  148. *     Read the threshold value of the test ratio
  149.       READ( NIN, FMT = * )THRESH
  150. *
  151. *     Read and check the parameter values for the tests.
  152. *
  153. *     Values of N
  154.       READ( NIN, FMT = * )NIDIM
  155.       IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN
  156.          WRITE( NOUT, FMT = 9997 )'N', NIDMAX
  157.          GO TO 230
  158.       END IF
  159.       READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )
  160.       DO 10 I = 1, NIDIM
  161.          IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN
  162.             WRITE( NOUT, FMT = 9996 )NMAX
  163.             GO TO 230
  164.          END IF
  165.    10 CONTINUE
  166. *     Values of K
  167.       READ( NIN, FMT = * )NKB
  168.       IF( NKB.LT.1.OR.NKB.GT.NKBMAX )THEN
  169.          WRITE( NOUT, FMT = 9997 )'K', NKBMAX
  170.          GO TO 230
  171.       END IF
  172.       READ( NIN, FMT = * )( KB( I ), I = 1, NKB )
  173.       DO 20 I = 1, NKB
  174.          IF( KB( I ).LT.0 )THEN
  175.             WRITE( NOUT, FMT = 9995 )
  176.             GO TO 230
  177.          END IF
  178.    20 CONTINUE
  179. *     Values of INCX and INCY
  180.       READ( NIN, FMT = * )NINC
  181.       IF( NINC.LT.1.OR.NINC.GT.NINMAX )THEN
  182.          WRITE( NOUT, FMT = 9997 )'INCX AND INCY', NINMAX
  183.          GO TO 230
  184.       END IF
  185.       READ( NIN, FMT = * )( INC( I ), I = 1, NINC )
  186.       DO 30 I = 1, NINC
  187.          IF( INC( I ).EQ.0.OR.ABS( INC( I ) ).GT.INCMAX )THEN
  188.             WRITE( NOUT, FMT = 9994 )INCMAX
  189.             GO TO 230
  190.          END IF
  191.    30 CONTINUE
  192. *     Values of ALPHA
  193.       READ( NIN, FMT = * )NALF
  194.       IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN
  195.          WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX
  196.          GO TO 230
  197.       END IF
  198.       READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )
  199. *     Values of BETA
  200.       READ( NIN, FMT = * )NBET
  201.       IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN
  202.          WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX
  203.          GO TO 230
  204.       END IF
  205.       READ( NIN, FMT = * )( BET( I ), I = 1, NBET )
  206. *
  207. *     Report values of parameters.
  208. *
  209.       WRITE( NOUT, FMT = 9993 )
  210.       WRITE( NOUT, FMT = 9992 )( IDIM( I ), I = 1, NIDIM )
  211.       WRITE( NOUT, FMT = 9991 )( KB( I ), I = 1, NKB )
  212.       WRITE( NOUT, FMT = 9990 )( INC( I ), I = 1, NINC )
  213.       WRITE( NOUT, FMT = 9989 )( ALF( I ), I = 1, NALF )
  214.       WRITE( NOUT, FMT = 9988 )( BET( I ), I = 1, NBET )
  215.       IF( .NOT.TSTERR )THEN
  216.          WRITE( NOUT, FMT = * )
  217.          WRITE( NOUT, FMT = 9980 )
  218.       END IF
  219.       WRITE( NOUT, FMT = * )
  220.       WRITE( NOUT, FMT = 9999 )THRESH
  221.       WRITE( NOUT, FMT = * )
  222. *
  223. *     Read names of subroutines and flags which indicate
  224. *     whether they are to be tested.
  225. *
  226.       DO 40 I = 1, NSUBS
  227.          LTEST( I ) = .FALSE.
  228.    40 CONTINUE
  229.    50 READ( NIN, FMT = 9984, END = 80 )SNAMET, LTESTT
  230.       DO 60 I = 1, NSUBS
  231.          IF( SNAMET.EQ.SNAMES( I ) )
  232.      $      GO TO 70
  233.    60 CONTINUE
  234.       WRITE( NOUT, FMT = 9986 )SNAMET
  235.       STOP
  236.    70 LTEST( I ) = LTESTT
  237.       GO TO 50
  238. *
  239.    80 CONTINUE
  240.       CLOSE ( NIN )
  241. *
  242. *     Compute EPS (the machine precision).
  243. *
  244.       EPS = RONE
  245.    90 CONTINUE
  246.       IF( DDIFF( RONE + EPS, RONE ).EQ.RZERO )
  247.      $   GO TO 100
  248.       EPS = RHALF*EPS
  249.       GO TO 90
  250.   100 CONTINUE
  251.       EPS = EPS + EPS
  252.       WRITE( NOUT, FMT = 9998 )EPS
  253. *
  254. *     Check the reliability of ZMVCH using exact data.
  255. *
  256.       N = MIN( 32, NMAX )
  257.       DO 120 J = 1, N
  258.          DO 110 I = 1, N
  259.             A( I, J ) = MAX( I - J + 1, 0 )
  260.   110    CONTINUE
  261.          X( J ) = J
  262.          Y( J ) = ZERO
  263.   120 CONTINUE
  264.       DO 130 J = 1, N
  265.          YY( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3
  266.   130 CONTINUE
  267. *     YY holds the exact result. On exit from ZMVCH YT holds
  268. *     the result computed by ZMVCH.
  269.       TRANS = 'N'
  270.       CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, X, 1, ZERO, Y, 1, YT, G,
  271.      $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )
  272.       SAME = LZE( YY, YT, N )
  273.       IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
  274.          WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR
  275.          STOP
  276.       END IF
  277.       TRANS = 'T'
  278.       CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, X, -1, ZERO, Y, -1, YT, G,
  279.      $            YY, EPS, ERR, FATAL, NOUT, .TRUE. )
  280.       SAME = LZE( YY, YT, N )
  281.       IF( .NOT.SAME.OR.ERR.NE.RZERO )THEN
  282.          WRITE( NOUT, FMT = 9985 )TRANS, SAME, ERR
  283.          STOP
  284.       END IF
  285. *
  286. *     Test each subroutine in turn.
  287. *
  288.       DO 210 ISNUM = 1, NSUBS
  289.          WRITE( NOUT, FMT = * )
  290.          IF( .NOT.LTEST( ISNUM ) )THEN
  291. *           Subprogram is not to be tested.
  292.             WRITE( NOUT, FMT = 9983 )SNAMES( ISNUM )
  293.          ELSE
  294.             SRNAMT = SNAMES( ISNUM )
  295. *           Test error exits.
  296.             IF( TSTERR )THEN
  297.                CALL ZCHKE( ISNUM, SNAMES( ISNUM ), NOUT )
  298.                WRITE( NOUT, FMT = * )
  299.             END IF
  300. *           Test computations.
  301.             INFOT = 0
  302.             OK = .TRUE.
  303.             FATAL = .FALSE.
  304.             GO TO ( 140, 140, 150, 150, 150, 160, 160,
  305.      $              160, 160, 160, 160, 170, 170, 180,
  306.      $              180, 190, 190 )ISNUM
  307. *           Test ZGEMV, 01, and ZGBMV, 02.
  308.   140       CALL ZCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  309.      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
  310.      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
  311.      $                  X, XX, XS, Y, YY, YS, YT, G )
  312.             GO TO 200
  313. *           Test ZHEMV, 03, ZHBMV, 04, and ZHPMV, 05.
  314.   150       CALL ZCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  315.      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF,
  316.      $                  NBET, BET, NINC, INC, NMAX, INCMAX, A, AA, AS,
  317.      $                  X, XX, XS, Y, YY, YS, YT, G )
  318.             GO TO 200
  319. *           Test ZTRMV, 06, ZTBMV, 07, ZTPMV, 08,
  320. *           ZTRSV, 09, ZTBSV, 10, and ZTPSV, 11.
  321.   160       CALL ZCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  322.      $                  REWI, FATAL, NIDIM, IDIM, NKB, KB, NINC, INC,
  323.      $                  NMAX, INCMAX, A, AA, AS, Y, YY, YS, YT, G, Z )
  324.             GO TO 200
  325. *           Test ZGERC, 12, ZGERU, 13.
  326.   170       CALL ZCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  327.      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
  328.      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
  329.      $                  YT, G, Z )
  330.             GO TO 200
  331. *           Test ZHER, 14, and ZHPR, 15.
  332.   180       CALL ZCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  333.      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
  334.      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
  335.      $                  YT, G, Z )
  336.             GO TO 200
  337. *           Test ZHER2, 16, and ZHPR2, 17.
  338.   190       CALL ZCHK6( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,
  339.      $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC,
  340.      $                  NMAX, INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS,
  341.      $                  YT, G, Z )
  342. *
  343.   200       IF( FATAL.AND.SFATAL )
  344.      $         GO TO 220
  345.          END IF
  346.   210 CONTINUE
  347.       WRITE( NOUT, FMT = 9982 )
  348.       GO TO 240
  349. *
  350.   220 CONTINUE
  351.       WRITE( NOUT, FMT = 9981 )
  352.       GO TO 240
  353. *
  354.   230 CONTINUE
  355.       WRITE( NOUT, FMT = 9987 )
  356. *
  357.   240 CONTINUE
  358.       IF( TRACE )
  359.      $   CLOSE ( NTRA )
  360.       CLOSE ( NOUT )
  361.       STOP
  362. *
  363.  9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',
  364.      $      'S THAN', F8.2 )
  365.  9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, D9.1 )
  366.  9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',
  367.      $      'THAN ', I2 )
  368.  9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )
  369.  9995 FORMAT( ' VALUE OF K IS LESS THAN 0' )
  370.  9994 FORMAT( ' ABSOLUTE VALUE OF INCX OR INCY IS 0 OR GREATER THAN ',
  371.      $      I2 )
  372.  9993 FORMAT( ' TESTS OF THE COMPLEX*16       LEVEL 2 BLAS', //' THE F',
  373.      $      'OLLOWING PARAMETER VALUES WILL BE USED:' )
  374.  9992 FORMAT( '   FOR N              ', 9I6 )
  375.  9991 FORMAT( '   FOR K              ', 7I6 )
  376.  9990 FORMAT( '   FOR INCX AND INCY  ', 7I6 )
  377.  9989 FORMAT( '   FOR ALPHA          ',
  378.      $      7( '(', F4.1, ',', F4.1, ')  ', : ) )
  379.  9988 FORMAT( '   FOR BETA           ',
  380.      $      7( '(', F4.1, ',', F4.1, ')  ', : ) )
  381.  9987 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',
  382.      $      /' ******* TESTS ABANDONED *******' )
  383.  9986 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',
  384.      $      'ESTS ABANDONED *******' )
  385.  9985 FORMAT( ' ERROR IN ZMVCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',
  386.      $      'ATED WRONGLY.', /' ZMVCH WAS CALLED WITH TRANS = ', A1,
  387.      $      ' AND RETURNED SAME = ', L1, ' AND ERR = ', F12.3, '.', /
  388.      $   ' THIS MAY BE DUE TO FAULTS IN THE ARITHMETIC OR THE COMPILER.'
  389.      $      , /' ******* TESTS ABANDONED *******' )
  390.  9984 FORMAT( A6, L2 )
  391.  9983 FORMAT( 1X, A6, ' WAS NOT TESTED' )
  392.  9982 FORMAT( /' END OF TESTS' )
  393.  9981 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )
  394.  9980 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )
  395. *
  396. *     End of ZBLAT2.
  397. *
  398.       END
  399.       SUBROUTINE ZCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  400.      $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,
  401.      $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,
  402.      $                  XS, Y, YY, YS, YT, G )
  403. *
  404. *  Tests ZGEMV and ZGBMV.
  405. *
  406. *  Auxiliary routine for test program for Level 2 Blas.
  407. *
  408. *  -- Written on 10-August-1987.
  409. *     Richard Hanson, Sandia National Labs.
  410. *     Jeremy Du Croz, NAG Central Office.
  411. *
  412. *     .. Parameters ..
  413.       COMPLEX*16         ZERO, HALF
  414.       PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),
  415.      $                   HALF = ( 0.5D0, 0.0D0 ) )
  416.       DOUBLE PRECISION   RZERO
  417.       PARAMETER          ( RZERO = 0.0D0 )
  418. *     .. Scalar Arguments ..
  419.       DOUBLE PRECISION   EPS, THRESH
  420.       INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,
  421.      $                   NOUT, NTRA
  422.       LOGICAL            FATAL, REWI, TRACE
  423.       CHARACTER*6        SNAME
  424. *     .. Array Arguments ..
  425.       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
  426.      $                   AS( NMAX*NMAX ), BET( NBET ), X( NMAX ),
  427.      $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),
  428.      $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),
  429.      $                   YY( NMAX*INCMAX )
  430.       DOUBLE PRECISION   G( NMAX )
  431.       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
  432. *     .. Local Scalars ..
  433.       COMPLEX*16         ALPHA, ALS, BETA, BLS, TRANSL
  434.       DOUBLE PRECISION   ERR, ERRMAX
  435.       INTEGER            I, IA, IB, IC, IKU, IM, IN, INCX, INCXS, INCY,
  436.      $                   INCYS, IX, IY, KL, KLS, KU, KUS, LAA, LDA,
  437.      $                   LDAS, LX, LY, M, ML, MS, N, NARGS, NC, ND, NK,
  438.      $                   NL, NS
  439.       LOGICAL            BANDED, FULL, NULL, RESET, SAME, TRAN
  440.       CHARACTER*1        TRANS, TRANSS
  441.       CHARACTER*3        ICH
  442. *     .. Local Arrays ..
  443.       LOGICAL            ISAME( 13 )
  444. *     .. External Functions ..
  445.       LOGICAL            LZE, LZERES
  446.       EXTERNAL           LZE, LZERES
  447. *     .. External Subroutines ..
  448.       EXTERNAL           ZGBMV, ZGEMV, ZMAKE, ZMVCH
  449. *     .. Intrinsic Functions ..
  450.       INTRINSIC          ABS, MAX, MIN
  451. *     .. Scalars in Common ..
  452.       INTEGER            INFOT, NOUTC
  453.       LOGICAL            LERR, OK
  454. *     .. Common blocks ..
  455.       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
  456. *     .. Data statements ..
  457.       DATA               ICH/'NTC'/
  458. *     .. Executable Statements ..
  459.       FULL = SNAME( 3: 3 ).EQ.'E'
  460.       BANDED = SNAME( 3: 3 ).EQ.'B'
  461. *     Define the number of arguments.
  462.       IF( FULL )THEN
  463.          NARGS = 11
  464.       ELSE IF( BANDED )THEN
  465.          NARGS = 13
  466.       END IF
  467. *
  468.       NC = 0
  469.       RESET = .TRUE.
  470.       ERRMAX = RZERO
  471. *
  472.       DO 120 IN = 1, NIDIM
  473.          N = IDIM( IN )
  474.          ND = N/2 + 1
  475. *
  476.          DO 110 IM = 1, 2
  477.             IF( IM.EQ.1 )
  478.      $         M = MAX( N - ND, 0 )
  479.             IF( IM.EQ.2 )
  480.      $         M = MIN( N + ND, NMAX )
  481. *
  482.             IF( BANDED )THEN
  483.                NK = NKB
  484.             ELSE
  485.                NK = 1
  486.             END IF
  487.             DO 100 IKU = 1, NK
  488.                IF( BANDED )THEN
  489.                   KU = KB( IKU )
  490.                   KL = MAX( KU - 1, 0 )
  491.                ELSE
  492.                   KU = N - 1
  493.                   KL = M - 1
  494.                END IF
  495. *              Set LDA to 1 more than minimum value if room.
  496.                IF( BANDED )THEN
  497.                   LDA = KL + KU + 1
  498.                ELSE
  499.                   LDA = M
  500.                END IF
  501.                IF( LDA.LT.NMAX )
  502.      $            LDA = LDA + 1
  503. *              Skip tests if not enough room.
  504.                IF( LDA.GT.NMAX )
  505.      $            GO TO 100
  506.                LAA = LDA*N
  507.                NULL = N.LE.0.OR.M.LE.0
  508. *
  509. *              Generate the matrix A.
  510. *
  511.                TRANSL = ZERO
  512.                CALL ZMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX, AA,
  513.      $                     LDA, KL, KU, RESET, TRANSL )
  514. *
  515.                DO 90 IC = 1, 3
  516.                   TRANS = ICH( IC: IC )
  517.                   TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'
  518. *
  519.                   IF( TRAN )THEN
  520.                      ML = N
  521.                      NL = M
  522.                   ELSE
  523.                      ML = M
  524.                      NL = N
  525.                   END IF
  526. *
  527.                   DO 80 IX = 1, NINC
  528.                      INCX = INC( IX )
  529.                      LX = ABS( INCX )*NL
  530. *
  531. *                    Generate the vector X.
  532. *
  533.                      TRANSL = HALF
  534.                      CALL ZMAKE( 'GE', ' ', ' ', 1, NL, X, 1, XX,
  535.      $                           ABS( INCX ), 0, NL - 1, RESET, TRANSL )
  536.                      IF( NL.GT.1 )THEN
  537.                         X( NL/2 ) = ZERO
  538.                         XX( 1 + ABS( INCX )*( NL/2 - 1 ) ) = ZERO
  539.                      END IF
  540. *
  541.                      DO 70 IY = 1, NINC
  542.                         INCY = INC( IY )
  543.                         LY = ABS( INCY )*ML
  544. *
  545.                         DO 60 IA = 1, NALF
  546.                            ALPHA = ALF( IA )
  547. *
  548.                            DO 50 IB = 1, NBET
  549.                               BETA = BET( IB )
  550. *
  551. *                             Generate the vector Y.
  552. *
  553.                               TRANSL = ZERO
  554.                               CALL ZMAKE( 'GE', ' ', ' ', 1, ML, Y, 1,
  555.      $                                    YY, ABS( INCY ), 0, ML - 1,
  556.      $                                    RESET, TRANSL )
  557. *
  558.                               NC = NC + 1
  559. *
  560. *                             Save every datum before calling the
  561. *                             subroutine.
  562. *
  563.                               TRANSS = TRANS
  564.                               MS = M
  565.                               NS = N
  566.                               KLS = KL
  567.                               KUS = KU
  568.                               ALS = ALPHA
  569.                               DO 10 I = 1, LAA
  570.                                  AS( I ) = AA( I )
  571.    10                         CONTINUE
  572.                               LDAS = LDA
  573.                               DO 20 I = 1, LX
  574.                                  XS( I ) = XX( I )
  575.    20                         CONTINUE
  576.                               INCXS = INCX
  577.                               BLS = BETA
  578.                               DO 30 I = 1, LY
  579.                                  YS( I ) = YY( I )
  580.    30                         CONTINUE
  581.                               INCYS = INCY
  582. *
  583. *                             Call the subroutine.
  584. *
  585.                               IF( FULL )THEN
  586.                                  IF( TRACE )
  587.      $                              WRITE( NTRA, FMT = 9994 )NC, SNAME,
  588.      $                              TRANS, M, N, ALPHA, LDA, INCX, BETA,
  589.      $                              INCY
  590.                                  IF( REWI )
  591.      $                              REWIND NTRA
  592.                                  CALL ZGEMV( TRANS, M, N, ALPHA, AA,
  593.      $                                       LDA, XX, INCX, BETA, YY,
  594.      $                                       INCY )
  595.                               ELSE IF( BANDED )THEN
  596.                                  IF( TRACE )
  597.      $                              WRITE( NTRA, FMT = 9995 )NC, SNAME,
  598.      $                              TRANS, M, N, KL, KU, ALPHA, LDA,
  599.      $                              INCX, BETA, INCY
  600.                                  IF( REWI )
  601.      $                              REWIND NTRA
  602.                                  CALL ZGBMV( TRANS, M, N, KL, KU, ALPHA,
  603.      $                                       AA, LDA, XX, INCX, BETA,
  604.      $                                       YY, INCY )
  605.                               END IF
  606. *
  607. *                             Check if error-exit was taken incorrectly.
  608. *
  609.                               IF( .NOT.OK )THEN
  610.                                  WRITE( NOUT, FMT = 9993 )
  611.                                  FATAL = .TRUE.
  612.                                  GO TO 130
  613.                               END IF
  614. *
  615. *                             See what data changed inside subroutines.
  616. *
  617.                               ISAME( 1 ) = TRANS.EQ.TRANSS
  618.                               ISAME( 2 ) = MS.EQ.M
  619.                               ISAME( 3 ) = NS.EQ.N
  620.                               IF( FULL )THEN
  621.                                  ISAME( 4 ) = ALS.EQ.ALPHA
  622.                                  ISAME( 5 ) = LZE( AS, AA, LAA )
  623.                                  ISAME( 6 ) = LDAS.EQ.LDA
  624.                                  ISAME( 7 ) = LZE( XS, XX, LX )
  625.                                  ISAME( 8 ) = INCXS.EQ.INCX
  626.                                  ISAME( 9 ) = BLS.EQ.BETA
  627.                                  IF( NULL )THEN
  628.                                     ISAME( 10 ) = LZE( YS, YY, LY )
  629.                                  ELSE
  630.                                     ISAME( 10 ) = LZERES( 'GE', ' ', 1,
  631.      $                                            ML, YS, YY,
  632.      $                                            ABS( INCY ) )
  633.                                  END IF
  634.                                  ISAME( 11 ) = INCYS.EQ.INCY
  635.                               ELSE IF( BANDED )THEN
  636.                                  ISAME( 4 ) = KLS.EQ.KL
  637.                                  ISAME( 5 ) = KUS.EQ.KU
  638.                                  ISAME( 6 ) = ALS.EQ.ALPHA
  639.                                  ISAME( 7 ) = LZE( AS, AA, LAA )
  640.                                  ISAME( 8 ) = LDAS.EQ.LDA
  641.                                  ISAME( 9 ) = LZE( XS, XX, LX )
  642.                                  ISAME( 10 ) = INCXS.EQ.INCX
  643.                                  ISAME( 11 ) = BLS.EQ.BETA
  644.                                  IF( NULL )THEN
  645.                                     ISAME( 12 ) = LZE( YS, YY, LY )
  646.                                  ELSE
  647.                                     ISAME( 12 ) = LZERES( 'GE', ' ', 1,
  648.      $                                            ML, YS, YY,
  649.      $                                            ABS( INCY ) )
  650.                                  END IF
  651.                                  ISAME( 13 ) = INCYS.EQ.INCY
  652.                               END IF
  653. *
  654. *                             If data was incorrectly changed, report
  655. *                             and return.
  656. *
  657.                               SAME = .TRUE.
  658.                               DO 40 I = 1, NARGS
  659.                                  SAME = SAME.AND.ISAME( I )
  660.                                  IF( .NOT.ISAME( I ) )
  661.      $                              WRITE( NOUT, FMT = 9998 )I
  662.    40                         CONTINUE
  663.                               IF( .NOT.SAME )THEN
  664.                                  FATAL = .TRUE.
  665.                                  GO TO 130
  666.                               END IF
  667. *
  668.                               IF( .NOT.NULL )THEN
  669. *
  670. *                                Check the result.
  671. *
  672.                                  CALL ZMVCH( TRANS, M, N, ALPHA, A,
  673.      $                                       NMAX, X, INCX, BETA, Y,
  674.      $                                       INCY, YT, G, YY, EPS, ERR,
  675.      $                                       FATAL, NOUT, .TRUE. )
  676.                                  ERRMAX = MAX( ERRMAX, ERR )
  677. *                                If got really bad answer, report and
  678. *                                return.
  679.                                  IF( FATAL )
  680.      $                              GO TO 130
  681.                               ELSE
  682. *                                Avoid repeating tests with M.le.0 or
  683. *                                N.le.0.
  684.                                  GO TO 110
  685.                               END IF
  686. *
  687.    50                      CONTINUE
  688. *
  689.    60                   CONTINUE
  690. *
  691.    70                CONTINUE
  692. *
  693.    80             CONTINUE
  694. *
  695.    90          CONTINUE
  696. *
  697.   100       CONTINUE
  698. *
  699.   110    CONTINUE
  700. *
  701.   120 CONTINUE
  702. *
  703. *     Report result.
  704. *
  705.       IF( ERRMAX.LT.THRESH )THEN
  706.          WRITE( NOUT, FMT = 9999 )SNAME, NC
  707.       ELSE
  708.          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
  709.       END IF
  710.       GO TO 140
  711. *
  712.   130 CONTINUE
  713.       WRITE( NOUT, FMT = 9996 )SNAME
  714.       IF( FULL )THEN
  715.          WRITE( NOUT, FMT = 9994 )NC, SNAME, TRANS, M, N, ALPHA, LDA,
  716.      $      INCX, BETA, INCY
  717.       ELSE IF( BANDED )THEN
  718.          WRITE( NOUT, FMT = 9995 )NC, SNAME, TRANS, M, N, KL, KU,
  719.      $      ALPHA, LDA, INCX, BETA, INCY
  720.       END IF
  721. *
  722.   140 CONTINUE
  723.       RETURN
  724. *
  725.  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
  726.      $      'S)' )
  727.  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  728.      $      'ANGED INCORRECTLY *******' )
  729.  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
  730.      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
  731.      $      ' - SUSPECT *******' )
  732.  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
  733.  9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 4( I3, ',' ), '(',
  734.      $      F4.1, ',', F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',',
  735.      $      F4.1, '), Y,', I2, ') .' )
  736.  9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), '(',
  737.      $      F4.1, ',', F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',',
  738.      $      F4.1, '), Y,', I2, ')         .' )
  739.  9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  740.      $      '******' )
  741. *
  742. *     End of ZCHK1.
  743. *
  744.       END
  745.       SUBROUTINE ZCHK2( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  746.      $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,
  747.      $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,
  748.      $                  XS, Y, YY, YS, YT, G )
  749. *
  750. *  Tests ZHEMV, ZHBMV and ZHPMV.
  751. *
  752. *  Auxiliary routine for test program for Level 2 Blas.
  753. *
  754. *  -- Written on 10-August-1987.
  755. *     Richard Hanson, Sandia National Labs.
  756. *     Jeremy Du Croz, NAG Central Office.
  757. *
  758. *     .. Parameters ..
  759.       COMPLEX*16         ZERO, HALF
  760.       PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),
  761.      $                   HALF = ( 0.5D0, 0.0D0 ) )
  762.       DOUBLE PRECISION   RZERO
  763.       PARAMETER          ( RZERO = 0.0D0 )
  764. *     .. Scalar Arguments ..
  765.       DOUBLE PRECISION   EPS, THRESH
  766.       INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,
  767.      $                   NOUT, NTRA
  768.       LOGICAL            FATAL, REWI, TRACE
  769.       CHARACTER*6        SNAME
  770. *     .. Array Arguments ..
  771.       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
  772.      $                   AS( NMAX*NMAX ), BET( NBET ), X( NMAX ),
  773.      $                   XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),
  774.      $                   Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),
  775.      $                   YY( NMAX*INCMAX )
  776.       DOUBLE PRECISION   G( NMAX )
  777.       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
  778. *     .. Local Scalars ..
  779.       COMPLEX*16         ALPHA, ALS, BETA, BLS, TRANSL
  780.       DOUBLE PRECISION   ERR, ERRMAX
  781.       INTEGER            I, IA, IB, IC, IK, IN, INCX, INCXS, INCY,
  782.      $                   INCYS, IX, IY, K, KS, LAA, LDA, LDAS, LX, LY,
  783.      $                   N, NARGS, NC, NK, NS
  784.       LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME
  785.       CHARACTER*1        UPLO, UPLOS
  786.       CHARACTER*2        ICH
  787. *     .. Local Arrays ..
  788.       LOGICAL            ISAME( 13 )
  789. *     .. External Functions ..
  790.       LOGICAL            LZE, LZERES
  791.       EXTERNAL           LZE, LZERES
  792. *     .. External Subroutines ..
  793.       EXTERNAL           ZHBMV, ZHEMV, ZHPMV, ZMAKE, ZMVCH
  794. *     .. Intrinsic Functions ..
  795.       INTRINSIC          ABS, MAX
  796. *     .. Scalars in Common ..
  797.       INTEGER            INFOT, NOUTC
  798.       LOGICAL            LERR, OK
  799. *     .. Common blocks ..
  800.       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
  801. *     .. Data statements ..
  802.       DATA               ICH/'UL'/
  803. *     .. Executable Statements ..
  804.       FULL = SNAME( 3: 3 ).EQ.'E'
  805.       BANDED = SNAME( 3: 3 ).EQ.'B'
  806.       PACKED = SNAME( 3: 3 ).EQ.'P'
  807. *     Define the number of arguments.
  808.       IF( FULL )THEN
  809.          NARGS = 10
  810.       ELSE IF( BANDED )THEN
  811.          NARGS = 11
  812.       ELSE IF( PACKED )THEN
  813.          NARGS = 9
  814.       END IF
  815. *
  816.       NC = 0
  817.       RESET = .TRUE.
  818.       ERRMAX = RZERO
  819. *
  820.       DO 110 IN = 1, NIDIM
  821.          N = IDIM( IN )
  822. *
  823.          IF( BANDED )THEN
  824.             NK = NKB
  825.          ELSE
  826.             NK = 1
  827.          END IF
  828.          DO 100 IK = 1, NK
  829.             IF( BANDED )THEN
  830.                K = KB( IK )
  831.             ELSE
  832.                K = N - 1
  833.             END IF
  834. *           Set LDA to 1 more than minimum value if room.
  835.             IF( BANDED )THEN
  836.                LDA = K + 1
  837.             ELSE
  838.                LDA = N
  839.             END IF
  840.             IF( LDA.LT.NMAX )
  841.      $         LDA = LDA + 1
  842. *           Skip tests if not enough room.
  843.             IF( LDA.GT.NMAX )
  844.      $         GO TO 100
  845.             IF( PACKED )THEN
  846.                LAA = ( N*( N + 1 ) )/2
  847.             ELSE
  848.                LAA = LDA*N
  849.             END IF
  850.             NULL = N.LE.0
  851. *
  852.             DO 90 IC = 1, 2
  853.                UPLO = ICH( IC: IC )
  854. *
  855. *              Generate the matrix A.
  856. *
  857.                TRANSL = ZERO
  858.                CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX, AA,
  859.      $                     LDA, K, K, RESET, TRANSL )
  860. *
  861.                DO 80 IX = 1, NINC
  862.                   INCX = INC( IX )
  863.                   LX = ABS( INCX )*N
  864. *
  865. *                 Generate the vector X.
  866. *
  867.                   TRANSL = HALF
  868.                   CALL ZMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,
  869.      $                        ABS( INCX ), 0, N - 1, RESET, TRANSL )
  870.                   IF( N.GT.1 )THEN
  871.                      X( N/2 ) = ZERO
  872.                      XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
  873.                   END IF
  874. *
  875.                   DO 70 IY = 1, NINC
  876.                      INCY = INC( IY )
  877.                      LY = ABS( INCY )*N
  878. *
  879.                      DO 60 IA = 1, NALF
  880.                         ALPHA = ALF( IA )
  881. *
  882.                         DO 50 IB = 1, NBET
  883.                            BETA = BET( IB )
  884. *
  885. *                          Generate the vector Y.
  886. *
  887.                            TRANSL = ZERO
  888.                            CALL ZMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,
  889.      $                                 ABS( INCY ), 0, N - 1, RESET,
  890.      $                                 TRANSL )
  891. *
  892.                            NC = NC + 1
  893. *
  894. *                          Save every datum before calling the
  895. *                          subroutine.
  896. *
  897.                            UPLOS = UPLO
  898.                            NS = N
  899.                            KS = K
  900.                            ALS = ALPHA
  901.                            DO 10 I = 1, LAA
  902.                               AS( I ) = AA( I )
  903.    10                      CONTINUE
  904.                            LDAS = LDA
  905.                            DO 20 I = 1, LX
  906.                               XS( I ) = XX( I )
  907.    20                      CONTINUE
  908.                            INCXS = INCX
  909.                            BLS = BETA
  910.                            DO 30 I = 1, LY
  911.                               YS( I ) = YY( I )
  912.    30                      CONTINUE
  913.                            INCYS = INCY
  914. *
  915. *                          Call the subroutine.
  916. *
  917.                            IF( FULL )THEN
  918.                               IF( TRACE )
  919.      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
  920.      $                           UPLO, N, ALPHA, LDA, INCX, BETA, INCY
  921.                               IF( REWI )
  922.      $                           REWIND NTRA
  923.                               CALL ZHEMV( UPLO, N, ALPHA, AA, LDA, XX,
  924.      $                                    INCX, BETA, YY, INCY )
  925.                            ELSE IF( BANDED )THEN
  926.                               IF( TRACE )
  927.      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
  928.      $                           UPLO, N, K, ALPHA, LDA, INCX, BETA,
  929.      $                           INCY
  930.                               IF( REWI )
  931.      $                           REWIND NTRA
  932.                               CALL ZHBMV( UPLO, N, K, ALPHA, AA, LDA,
  933.      $                                    XX, INCX, BETA, YY, INCY )
  934.                            ELSE IF( PACKED )THEN
  935.                               IF( TRACE )
  936.      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
  937.      $                           UPLO, N, ALPHA, INCX, BETA, INCY
  938.                               IF( REWI )
  939.      $                           REWIND NTRA
  940.                               CALL ZHPMV( UPLO, N, ALPHA, AA, XX, INCX,
  941.      $                                    BETA, YY, INCY )
  942.                            END IF
  943. *
  944. *                          Check if error-exit was taken incorrectly.
  945. *
  946.                            IF( .NOT.OK )THEN
  947.                               WRITE( NOUT, FMT = 9992 )
  948.                               FATAL = .TRUE.
  949.                               GO TO 120
  950.                            END IF
  951. *
  952. *                          See what data changed inside subroutines.
  953. *
  954.                            ISAME( 1 ) = UPLO.EQ.UPLOS
  955.                            ISAME( 2 ) = NS.EQ.N
  956.                            IF( FULL )THEN
  957.                               ISAME( 3 ) = ALS.EQ.ALPHA
  958.                               ISAME( 4 ) = LZE( AS, AA, LAA )
  959.                               ISAME( 5 ) = LDAS.EQ.LDA
  960.                               ISAME( 6 ) = LZE( XS, XX, LX )
  961.                               ISAME( 7 ) = INCXS.EQ.INCX
  962.                               ISAME( 8 ) = BLS.EQ.BETA
  963.                               IF( NULL )THEN
  964.                                  ISAME( 9 ) = LZE( YS, YY, LY )
  965.                               ELSE
  966.                                  ISAME( 9 ) = LZERES( 'GE', ' ', 1, N,
  967.      $                                        YS, YY, ABS( INCY ) )
  968.                               END IF
  969.                               ISAME( 10 ) = INCYS.EQ.INCY
  970.                            ELSE IF( BANDED )THEN
  971.                               ISAME( 3 ) = KS.EQ.K
  972.                               ISAME( 4 ) = ALS.EQ.ALPHA
  973.                               ISAME( 5 ) = LZE( AS, AA, LAA )
  974.                               ISAME( 6 ) = LDAS.EQ.LDA
  975.                               ISAME( 7 ) = LZE( XS, XX, LX )
  976.                               ISAME( 8 ) = INCXS.EQ.INCX
  977.                               ISAME( 9 ) = BLS.EQ.BETA
  978.                               IF( NULL )THEN
  979.                                  ISAME( 10 ) = LZE( YS, YY, LY )
  980.                               ELSE
  981.                                  ISAME( 10 ) = LZERES( 'GE', ' ', 1, N,
  982.      $                                         YS, YY, ABS( INCY ) )
  983.                               END IF
  984.                               ISAME( 11 ) = INCYS.EQ.INCY
  985.                            ELSE IF( PACKED )THEN
  986.                               ISAME( 3 ) = ALS.EQ.ALPHA
  987.                               ISAME( 4 ) = LZE( AS, AA, LAA )
  988.                               ISAME( 5 ) = LZE( XS, XX, LX )
  989.                               ISAME( 6 ) = INCXS.EQ.INCX
  990.                               ISAME( 7 ) = BLS.EQ.BETA
  991.                               IF( NULL )THEN
  992.                                  ISAME( 8 ) = LZE( YS, YY, LY )
  993.                               ELSE
  994.                                  ISAME( 8 ) = LZERES( 'GE', ' ', 1, N,
  995.      $                                        YS, YY, ABS( INCY ) )
  996.                               END IF
  997.                               ISAME( 9 ) = INCYS.EQ.INCY
  998.                            END IF
  999. *
  1000. *                          If data was incorrectly changed, report and
  1001. *                          return.
  1002. *
  1003.                            SAME = .TRUE.
  1004.                            DO 40 I = 1, NARGS
  1005.                               SAME = SAME.AND.ISAME( I )
  1006.                               IF( .NOT.ISAME( I ) )
  1007.      $                           WRITE( NOUT, FMT = 9998 )I
  1008.    40                      CONTINUE
  1009.                            IF( .NOT.SAME )THEN
  1010.                               FATAL = .TRUE.
  1011.                               GO TO 120
  1012.                            END IF
  1013. *
  1014.                            IF( .NOT.NULL )THEN
  1015. *
  1016. *                             Check the result.
  1017. *
  1018.                               CALL ZMVCH( 'N', N, N, ALPHA, A, NMAX, X,
  1019.      $                                    INCX, BETA, Y, INCY, YT, G,
  1020.      $                                    YY, EPS, ERR, FATAL, NOUT,
  1021.      $                                    .TRUE. )
  1022.                               ERRMAX = MAX( ERRMAX, ERR )
  1023. *                             If got really bad answer, report and
  1024. *                             return.
  1025.                               IF( FATAL )
  1026.      $                           GO TO 120
  1027.                            ELSE
  1028. *                             Avoid repeating tests with N.le.0
  1029.                               GO TO 110
  1030.                            END IF
  1031. *
  1032.    50                   CONTINUE
  1033. *
  1034.    60                CONTINUE
  1035. *
  1036.    70             CONTINUE
  1037. *
  1038.    80          CONTINUE
  1039. *
  1040.    90       CONTINUE
  1041. *
  1042.   100    CONTINUE
  1043. *
  1044.   110 CONTINUE
  1045. *
  1046. *     Report result.
  1047. *
  1048.       IF( ERRMAX.LT.THRESH )THEN
  1049.          WRITE( NOUT, FMT = 9999 )SNAME, NC
  1050.       ELSE
  1051.          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
  1052.       END IF
  1053.       GO TO 130
  1054. *
  1055.   120 CONTINUE
  1056.       WRITE( NOUT, FMT = 9996 )SNAME
  1057.       IF( FULL )THEN
  1058.          WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, LDA, INCX,
  1059.      $      BETA, INCY
  1060.       ELSE IF( BANDED )THEN
  1061.          WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, K, ALPHA, LDA,
  1062.      $      INCX, BETA, INCY
  1063.       ELSE IF( PACKED )THEN
  1064.          WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, N, ALPHA, INCX,
  1065.      $      BETA, INCY
  1066.       END IF
  1067. *
  1068.   130 CONTINUE
  1069.       RETURN
  1070. *
  1071.  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
  1072.      $      'S)' )
  1073.  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  1074.      $      'ANGED INCORRECTLY *******' )
  1075.  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
  1076.      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
  1077.      $      ' - SUSPECT *******' )
  1078.  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
  1079.  9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',
  1080.      $      F4.1, '), AP, X,', I2, ',(', F4.1, ',', F4.1, '), Y,', I2,
  1081.      $      ')                .' )
  1082.  9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), '(',
  1083.      $      F4.1, ',', F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',',
  1084.      $      F4.1, '), Y,', I2, ')         .' )
  1085.  9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',
  1086.      $      F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',', F4.1, '), ',
  1087.      $      'Y,', I2, ')             .' )
  1088.  9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  1089.      $      '******' )
  1090. *
  1091. *     End of ZCHK2.
  1092. *
  1093.       END
  1094.       SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  1095.      $                  FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX,
  1096.      $                  INCMAX, A, AA, AS, X, XX, XS, XT, G, Z )
  1097. *
  1098. *  Tests ZTRMV, ZTBMV, ZTPMV, ZTRSV, ZTBSV and ZTPSV.
  1099. *
  1100. *  Auxiliary routine for test program for Level 2 Blas.
  1101. *
  1102. *  -- Written on 10-August-1987.
  1103. *     Richard Hanson, Sandia National Labs.
  1104. *     Jeremy Du Croz, NAG Central Office.
  1105. *
  1106. *     .. Parameters ..
  1107.       COMPLEX*16         ZERO, HALF, ONE
  1108.       PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),
  1109.      $                   HALF = ( 0.5D0, 0.0D0 ),
  1110.      $                   ONE = ( 1.0D0, 0.0D0 ) )
  1111.       DOUBLE PRECISION   RZERO
  1112.       PARAMETER          ( RZERO = 0.0D0 )
  1113. *     .. Scalar Arguments ..
  1114.       DOUBLE PRECISION   EPS, THRESH
  1115.       INTEGER            INCMAX, NIDIM, NINC, NKB, NMAX, NOUT, NTRA
  1116.       LOGICAL            FATAL, REWI, TRACE
  1117.       CHARACTER*6        SNAME
  1118. *     .. Array Arguments ..
  1119.       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ),
  1120.      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
  1121.      $                   XT( NMAX ), XX( NMAX*INCMAX ), Z( NMAX )
  1122.       DOUBLE PRECISION   G( NMAX )
  1123.       INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )
  1124. *     .. Local Scalars ..
  1125.       COMPLEX*16         TRANSL
  1126.       DOUBLE PRECISION   ERR, ERRMAX
  1127.       INTEGER            I, ICD, ICT, ICU, IK, IN, INCX, INCXS, IX, K,
  1128.      $                   KS, LAA, LDA, LDAS, LX, N, NARGS, NC, NK, NS
  1129.       LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME
  1130.       CHARACTER*1        DIAG, DIAGS, TRANS, TRANSS, UPLO, UPLOS
  1131.       CHARACTER*2        ICHD, ICHU
  1132.       CHARACTER*3        ICHT
  1133. *     .. Local Arrays ..
  1134.       LOGICAL            ISAME( 13 )
  1135. *     .. External Functions ..
  1136.       LOGICAL            LZE, LZERES
  1137.       EXTERNAL           LZE, LZERES
  1138. *     .. External Subroutines ..
  1139.       EXTERNAL           ZMAKE, ZMVCH, ZTBMV, ZTBSV, ZTPMV, ZTPSV,
  1140.      $                   ZTRMV, ZTRSV
  1141. *     .. Intrinsic Functions ..
  1142.       INTRINSIC          ABS, MAX
  1143. *     .. Scalars in Common ..
  1144.       INTEGER            INFOT, NOUTC
  1145.       LOGICAL            LERR, OK
  1146. *     .. Common blocks ..
  1147.       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
  1148. *     .. Data statements ..
  1149.       DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/
  1150. *     .. Executable Statements ..
  1151.       FULL = SNAME( 3: 3 ).EQ.'R'
  1152.       BANDED = SNAME( 3: 3 ).EQ.'B'
  1153.       PACKED = SNAME( 3: 3 ).EQ.'P'
  1154. *     Define the number of arguments.
  1155.       IF( FULL )THEN
  1156.          NARGS = 8
  1157.       ELSE IF( BANDED )THEN
  1158.          NARGS = 9
  1159.       ELSE IF( PACKED )THEN
  1160.          NARGS = 7
  1161.       END IF
  1162. *
  1163.       NC = 0
  1164.       RESET = .TRUE.
  1165.       ERRMAX = RZERO
  1166. *     Set up zero vector for ZMVCH.
  1167.       DO 10 I = 1, NMAX
  1168.          Z( I ) = ZERO
  1169.    10 CONTINUE
  1170. *
  1171.       DO 110 IN = 1, NIDIM
  1172.          N = IDIM( IN )
  1173. *
  1174.          IF( BANDED )THEN
  1175.             NK = NKB
  1176.          ELSE
  1177.             NK = 1
  1178.          END IF
  1179.          DO 100 IK = 1, NK
  1180.             IF( BANDED )THEN
  1181.                K = KB( IK )
  1182.             ELSE
  1183.                K = N - 1
  1184.             END IF
  1185. *           Set LDA to 1 more than minimum value if room.
  1186.             IF( BANDED )THEN
  1187.                LDA = K + 1
  1188.             ELSE
  1189.                LDA = N
  1190.             END IF
  1191.             IF( LDA.LT.NMAX )
  1192.      $         LDA = LDA + 1
  1193. *           Skip tests if not enough room.
  1194.             IF( LDA.GT.NMAX )
  1195.      $         GO TO 100
  1196.             IF( PACKED )THEN
  1197.                LAA = ( N*( N + 1 ) )/2
  1198.             ELSE
  1199.                LAA = LDA*N
  1200.             END IF
  1201.             NULL = N.LE.0
  1202. *
  1203.             DO 90 ICU = 1, 2
  1204.                UPLO = ICHU( ICU: ICU )
  1205. *
  1206.                DO 80 ICT = 1, 3
  1207.                   TRANS = ICHT( ICT: ICT )
  1208. *
  1209.                   DO 70 ICD = 1, 2
  1210.                      DIAG = ICHD( ICD: ICD )
  1211. *
  1212. *                    Generate the matrix A.
  1213. *
  1214.                      TRANSL = ZERO
  1215.                      CALL ZMAKE( SNAME( 2: 3 ), UPLO, DIAG, N, N, A,
  1216.      $                           NMAX, AA, LDA, K, K, RESET, TRANSL )
  1217. *
  1218.                      DO 60 IX = 1, NINC
  1219.                         INCX = INC( IX )
  1220.                         LX = ABS( INCX )*N
  1221. *
  1222. *                       Generate the vector X.
  1223. *
  1224.                         TRANSL = HALF
  1225.                         CALL ZMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,
  1226.      $                              ABS( INCX ), 0, N - 1, RESET,
  1227.      $                              TRANSL )
  1228.                         IF( N.GT.1 )THEN
  1229.                            X( N/2 ) = ZERO
  1230.                            XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
  1231.                         END IF
  1232. *
  1233.                         NC = NC + 1
  1234. *
  1235. *                       Save every datum before calling the subroutine.
  1236. *
  1237.                         UPLOS = UPLO
  1238.                         TRANSS = TRANS
  1239.                         DIAGS = DIAG
  1240.                         NS = N
  1241.                         KS = K
  1242.                         DO 20 I = 1, LAA
  1243.                            AS( I ) = AA( I )
  1244.    20                   CONTINUE
  1245.                         LDAS = LDA
  1246.                         DO 30 I = 1, LX
  1247.                            XS( I ) = XX( I )
  1248.    30                   CONTINUE
  1249.                         INCXS = INCX
  1250. *
  1251. *                       Call the subroutine.
  1252. *
  1253.                         IF( SNAME( 4: 5 ).EQ.'MV' )THEN
  1254.                            IF( FULL )THEN
  1255.                               IF( TRACE )
  1256.      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
  1257.      $                           UPLO, TRANS, DIAG, N, LDA, INCX
  1258.                               IF( REWI )
  1259.      $                           REWIND NTRA
  1260.                               CALL ZTRMV( UPLO, TRANS, DIAG, N, AA, LDA,
  1261.      $                                    XX, INCX )
  1262.                            ELSE IF( BANDED )THEN
  1263.                               IF( TRACE )
  1264.      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
  1265.      $                           UPLO, TRANS, DIAG, N, K, LDA, INCX
  1266.                               IF( REWI )
  1267.      $                           REWIND NTRA
  1268.                               CALL ZTBMV( UPLO, TRANS, DIAG, N, K, AA,
  1269.      $                                    LDA, XX, INCX )
  1270.                            ELSE IF( PACKED )THEN
  1271.                               IF( TRACE )
  1272.      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
  1273.      $                           UPLO, TRANS, DIAG, N, INCX
  1274.                               IF( REWI )
  1275.      $                           REWIND NTRA
  1276.                               CALL ZTPMV( UPLO, TRANS, DIAG, N, AA, XX,
  1277.      $                                    INCX )
  1278.                            END IF
  1279.                         ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN
  1280.                            IF( FULL )THEN
  1281.                               IF( TRACE )
  1282.      $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,
  1283.      $                           UPLO, TRANS, DIAG, N, LDA, INCX
  1284.                               IF( REWI )
  1285.      $                           REWIND NTRA
  1286.                               CALL ZTRSV( UPLO, TRANS, DIAG, N, AA, LDA,
  1287.      $                                    XX, INCX )
  1288.                            ELSE IF( BANDED )THEN
  1289.                               IF( TRACE )
  1290.      $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,
  1291.      $                           UPLO, TRANS, DIAG, N, K, LDA, INCX
  1292.                               IF( REWI )
  1293.      $                           REWIND NTRA
  1294.                               CALL ZTBSV( UPLO, TRANS, DIAG, N, K, AA,
  1295.      $                                    LDA, XX, INCX )
  1296.                            ELSE IF( PACKED )THEN
  1297.                               IF( TRACE )
  1298.      $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,
  1299.      $                           UPLO, TRANS, DIAG, N, INCX
  1300.                               IF( REWI )
  1301.      $                           REWIND NTRA
  1302.                               CALL ZTPSV( UPLO, TRANS, DIAG, N, AA, XX,
  1303.      $                                    INCX )
  1304.                            END IF
  1305.                         END IF
  1306. *
  1307. *                       Check if error-exit was taken incorrectly.
  1308. *
  1309.                         IF( .NOT.OK )THEN
  1310.                            WRITE( NOUT, FMT = 9992 )
  1311.                            FATAL = .TRUE.
  1312.                            GO TO 120
  1313.                         END IF
  1314. *
  1315. *                       See what data changed inside subroutines.
  1316. *
  1317.                         ISAME( 1 ) = UPLO.EQ.UPLOS
  1318.                         ISAME( 2 ) = TRANS.EQ.TRANSS
  1319.                         ISAME( 3 ) = DIAG.EQ.DIAGS
  1320.                         ISAME( 4 ) = NS.EQ.N
  1321.                         IF( FULL )THEN
  1322.                            ISAME( 5 ) = LZE( AS, AA, LAA )
  1323.                            ISAME( 6 ) = LDAS.EQ.LDA
  1324.                            IF( NULL )THEN
  1325.                               ISAME( 7 ) = LZE( XS, XX, LX )
  1326.                            ELSE
  1327.                               ISAME( 7 ) = LZERES( 'GE', ' ', 1, N, XS,
  1328.      $                                     XX, ABS( INCX ) )
  1329.                            END IF
  1330.                            ISAME( 8 ) = INCXS.EQ.INCX
  1331.                         ELSE IF( BANDED )THEN
  1332.                            ISAME( 5 ) = KS.EQ.K
  1333.                            ISAME( 6 ) = LZE( AS, AA, LAA )
  1334.                            ISAME( 7 ) = LDAS.EQ.LDA
  1335.                            IF( NULL )THEN
  1336.                               ISAME( 8 ) = LZE( XS, XX, LX )
  1337.                            ELSE
  1338.                               ISAME( 8 ) = LZERES( 'GE', ' ', 1, N, XS,
  1339.      $                                     XX, ABS( INCX ) )
  1340.                            END IF
  1341.                            ISAME( 9 ) = INCXS.EQ.INCX
  1342.                         ELSE IF( PACKED )THEN
  1343.                            ISAME( 5 ) = LZE( AS, AA, LAA )
  1344.                            IF( NULL )THEN
  1345.                               ISAME( 6 ) = LZE( XS, XX, LX )
  1346.                            ELSE
  1347.                               ISAME( 6 ) = LZERES( 'GE', ' ', 1, N, XS,
  1348.      $                                     XX, ABS( INCX ) )
  1349.                            END IF
  1350.                            ISAME( 7 ) = INCXS.EQ.INCX
  1351.                         END IF
  1352. *
  1353. *                       If data was incorrectly changed, report and
  1354. *                       return.
  1355. *
  1356.                         SAME = .TRUE.
  1357.                         DO 40 I = 1, NARGS
  1358.                            SAME = SAME.AND.ISAME( I )
  1359.                            IF( .NOT.ISAME( I ) )
  1360.      $                        WRITE( NOUT, FMT = 9998 )I
  1361.    40                   CONTINUE
  1362.                         IF( .NOT.SAME )THEN
  1363.                            FATAL = .TRUE.
  1364.                            GO TO 120
  1365.                         END IF
  1366. *
  1367.                         IF( .NOT.NULL )THEN
  1368.                            IF( SNAME( 4: 5 ).EQ.'MV' )THEN
  1369. *
  1370. *                             Check the result.
  1371. *
  1372.                               CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, X,
  1373.      $                                    INCX, ZERO, Z, INCX, XT, G,
  1374.      $                                    XX, EPS, ERR, FATAL, NOUT,
  1375.      $                                    .TRUE. )
  1376.                            ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN
  1377. *
  1378. *                             Compute approximation to original vector.
  1379. *
  1380.                               DO 50 I = 1, N
  1381.                                  Z( I ) = XX( 1 + ( I - 1 )*
  1382.      $                                    ABS( INCX ) )
  1383.                                  XX( 1 + ( I - 1 )*ABS( INCX ) )
  1384.      $                              = X( I )
  1385.    50                         CONTINUE
  1386.                               CALL ZMVCH( TRANS, N, N, ONE, A, NMAX, Z,
  1387.      $                                    INCX, ZERO, X, INCX, XT, G,
  1388.      $                                    XX, EPS, ERR, FATAL, NOUT,
  1389.      $                                    .FALSE. )
  1390.                            END IF
  1391.                            ERRMAX = MAX( ERRMAX, ERR )
  1392. *                          If got really bad answer, report and return.
  1393.                            IF( FATAL )
  1394.      $                        GO TO 120
  1395.                         ELSE
  1396. *                          Avoid repeating tests with N.le.0.
  1397.                            GO TO 110
  1398.                         END IF
  1399. *
  1400.    60                CONTINUE
  1401. *
  1402.    70             CONTINUE
  1403. *
  1404.    80          CONTINUE
  1405. *
  1406.    90       CONTINUE
  1407. *
  1408.   100    CONTINUE
  1409. *
  1410.   110 CONTINUE
  1411. *
  1412. *     Report result.
  1413. *
  1414.       IF( ERRMAX.LT.THRESH )THEN
  1415.          WRITE( NOUT, FMT = 9999 )SNAME, NC
  1416.       ELSE
  1417.          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
  1418.       END IF
  1419.       GO TO 130
  1420. *
  1421.   120 CONTINUE
  1422.       WRITE( NOUT, FMT = 9996 )SNAME
  1423.       IF( FULL )THEN
  1424.          WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, DIAG, N, LDA,
  1425.      $      INCX
  1426.       ELSE IF( BANDED )THEN
  1427.          WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, DIAG, N, K,
  1428.      $      LDA, INCX
  1429.       ELSE IF( PACKED )THEN
  1430.          WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, TRANS, DIAG, N, INCX
  1431.       END IF
  1432. *
  1433.   130 CONTINUE
  1434.       RETURN
  1435. *
  1436.  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
  1437.      $      'S)' )
  1438.  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  1439.      $      'ANGED INCORRECTLY *******' )
  1440.  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
  1441.      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
  1442.      $      ' - SUSPECT *******' )
  1443.  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
  1444.  9995 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', AP, ',
  1445.      $      'X,', I2, ')                                      .' )
  1446.  9994 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), 2( I3, ',' ),
  1447.      $      ' A,', I3, ', X,', I2, ')                               .' )
  1448.  9993 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', A,',
  1449.      $      I3, ', X,', I2, ')                                   .' )
  1450.  9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  1451.      $      '******' )
  1452. *
  1453. *     End of ZCHK3.
  1454. *
  1455.       END
  1456.       SUBROUTINE ZCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  1457.      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
  1458.      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
  1459.      $                  Z )
  1460. *
  1461. *  Tests ZGERC and ZGERU.
  1462. *
  1463. *  Auxiliary routine for test program for Level 2 Blas.
  1464. *
  1465. *  -- Written on 10-August-1987.
  1466. *     Richard Hanson, Sandia National Labs.
  1467. *     Jeremy Du Croz, NAG Central Office.
  1468. *
  1469. *     .. Parameters ..
  1470.       COMPLEX*16         ZERO, HALF, ONE
  1471.       PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),
  1472.      $                   HALF = ( 0.5D0, 0.0D0 ),
  1473.      $                   ONE = ( 1.0D0, 0.0D0 ) )
  1474.       DOUBLE PRECISION   RZERO
  1475.       PARAMETER          ( RZERO = 0.0D0 )
  1476. *     .. Scalar Arguments ..
  1477.       DOUBLE PRECISION   EPS, THRESH
  1478.       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA
  1479.       LOGICAL            FATAL, REWI, TRACE
  1480.       CHARACTER*6        SNAME
  1481. *     .. Array Arguments ..
  1482.       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
  1483.      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
  1484.      $                   XX( NMAX*INCMAX ), Y( NMAX ),
  1485.      $                   YS( NMAX*INCMAX ), YT( NMAX ),
  1486.      $                   YY( NMAX*INCMAX ), Z( NMAX )
  1487.       DOUBLE PRECISION   G( NMAX )
  1488.       INTEGER            IDIM( NIDIM ), INC( NINC )
  1489. *     .. Local Scalars ..
  1490.       COMPLEX*16         ALPHA, ALS, TRANSL
  1491.       DOUBLE PRECISION   ERR, ERRMAX
  1492.       INTEGER            I, IA, IM, IN, INCX, INCXS, INCY, INCYS, IX,
  1493.      $                   IY, J, LAA, LDA, LDAS, LX, LY, M, MS, N, NARGS,
  1494.      $                   NC, ND, NS
  1495.       LOGICAL            CONJ, NULL, RESET, SAME
  1496. *     .. Local Arrays ..
  1497.       COMPLEX*16         W( 1 )
  1498.       LOGICAL            ISAME( 13 )
  1499. *     .. External Functions ..
  1500.       LOGICAL            LZE, LZERES
  1501.       EXTERNAL           LZE, LZERES
  1502. *     .. External Subroutines ..
  1503.       EXTERNAL           ZGERC, ZGERU, ZMAKE, ZMVCH
  1504. *     .. Intrinsic Functions ..
  1505.       INTRINSIC          ABS, DCONJG, MAX, MIN
  1506. *     .. Scalars in Common ..
  1507.       INTEGER            INFOT, NOUTC
  1508.       LOGICAL            LERR, OK
  1509. *     .. Common blocks ..
  1510.       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
  1511. *     .. Executable Statements ..
  1512.       CONJ = SNAME( 5: 5 ).EQ.'C'
  1513. *     Define the number of arguments.
  1514.       NARGS = 9
  1515. *
  1516.       NC = 0
  1517.       RESET = .TRUE.
  1518.       ERRMAX = RZERO
  1519. *
  1520.       DO 120 IN = 1, NIDIM
  1521.          N = IDIM( IN )
  1522.          ND = N/2 + 1
  1523. *
  1524.          DO 110 IM = 1, 2
  1525.             IF( IM.EQ.1 )
  1526.      $         M = MAX( N - ND, 0 )
  1527.             IF( IM.EQ.2 )
  1528.      $         M = MIN( N + ND, NMAX )
  1529. *
  1530. *           Set LDA to 1 more than minimum value if room.
  1531.             LDA = M
  1532.             IF( LDA.LT.NMAX )
  1533.      $         LDA = LDA + 1
  1534. *           Skip tests if not enough room.
  1535.             IF( LDA.GT.NMAX )
  1536.      $         GO TO 110
  1537.             LAA = LDA*N
  1538.             NULL = N.LE.0.OR.M.LE.0
  1539. *
  1540.             DO 100 IX = 1, NINC
  1541.                INCX = INC( IX )
  1542.                LX = ABS( INCX )*M
  1543. *
  1544. *              Generate the vector X.
  1545. *
  1546.                TRANSL = HALF
  1547.                CALL ZMAKE( 'GE', ' ', ' ', 1, M, X, 1, XX, ABS( INCX ),
  1548.      $                     0, M - 1, RESET, TRANSL )
  1549.                IF( M.GT.1 )THEN
  1550.                   X( M/2 ) = ZERO
  1551.                   XX( 1 + ABS( INCX )*( M/2 - 1 ) ) = ZERO
  1552.                END IF
  1553. *
  1554.                DO 90 IY = 1, NINC
  1555.                   INCY = INC( IY )
  1556.                   LY = ABS( INCY )*N
  1557. *
  1558. *                 Generate the vector Y.
  1559. *
  1560.                   TRANSL = ZERO
  1561.                   CALL ZMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,
  1562.      $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )
  1563.                   IF( N.GT.1 )THEN
  1564.                      Y( N/2 ) = ZERO
  1565.                      YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO
  1566.                   END IF
  1567. *
  1568.                   DO 80 IA = 1, NALF
  1569.                      ALPHA = ALF( IA )
  1570. *
  1571. *                    Generate the matrix A.
  1572. *
  1573.                      TRANSL = ZERO
  1574.                      CALL ZMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX,
  1575.      $                           AA, LDA, M - 1, N - 1, RESET, TRANSL )
  1576. *
  1577.                      NC = NC + 1
  1578. *
  1579. *                    Save every datum before calling the subroutine.
  1580. *
  1581.                      MS = M
  1582.                      NS = N
  1583.                      ALS = ALPHA
  1584.                      DO 10 I = 1, LAA
  1585.                         AS( I ) = AA( I )
  1586.    10                CONTINUE
  1587.                      LDAS = LDA
  1588.                      DO 20 I = 1, LX
  1589.                         XS( I ) = XX( I )
  1590.    20                CONTINUE
  1591.                      INCXS = INCX
  1592.                      DO 30 I = 1, LY
  1593.                         YS( I ) = YY( I )
  1594.    30                CONTINUE
  1595.                      INCYS = INCY
  1596. *
  1597. *                    Call the subroutine.
  1598. *
  1599.                      IF( TRACE )
  1600.      $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, M, N,
  1601.      $                  ALPHA, INCX, INCY, LDA
  1602.                      IF( CONJ )THEN
  1603.                         IF( REWI )
  1604.      $                     REWIND NTRA
  1605.                         CALL ZGERC( M, N, ALPHA, XX, INCX, YY, INCY, AA,
  1606.      $                              LDA )
  1607.                      ELSE
  1608.                         IF( REWI )
  1609.      $                     REWIND NTRA
  1610.                         CALL ZGERU( M, N, ALPHA, XX, INCX, YY, INCY, AA,
  1611.      $                              LDA )
  1612.                      END IF
  1613. *
  1614. *                    Check if error-exit was taken incorrectly.
  1615. *
  1616.                      IF( .NOT.OK )THEN
  1617.                         WRITE( NOUT, FMT = 9993 )
  1618.                         FATAL = .TRUE.
  1619.                         GO TO 140
  1620.                      END IF
  1621. *
  1622. *                    See what data changed inside subroutine.
  1623. *
  1624.                      ISAME( 1 ) = MS.EQ.M
  1625.                      ISAME( 2 ) = NS.EQ.N
  1626.                      ISAME( 3 ) = ALS.EQ.ALPHA
  1627.                      ISAME( 4 ) = LZE( XS, XX, LX )
  1628.                      ISAME( 5 ) = INCXS.EQ.INCX
  1629.                      ISAME( 6 ) = LZE( YS, YY, LY )
  1630.                      ISAME( 7 ) = INCYS.EQ.INCY
  1631.                      IF( NULL )THEN
  1632.                         ISAME( 8 ) = LZE( AS, AA, LAA )
  1633.                      ELSE
  1634.                         ISAME( 8 ) = LZERES( 'GE', ' ', M, N, AS, AA,
  1635.      $                               LDA )
  1636.                      END IF
  1637.                      ISAME( 9 ) = LDAS.EQ.LDA
  1638. *
  1639. *                    If data was incorrectly changed, report and return.
  1640. *
  1641.                      SAME = .TRUE.
  1642.                      DO 40 I = 1, NARGS
  1643.                         SAME = SAME.AND.ISAME( I )
  1644.                         IF( .NOT.ISAME( I ) )
  1645.      $                     WRITE( NOUT, FMT = 9998 )I
  1646.    40                CONTINUE
  1647.                      IF( .NOT.SAME )THEN
  1648.                         FATAL = .TRUE.
  1649.                         GO TO 140
  1650.                      END IF
  1651. *
  1652.                      IF( .NOT.NULL )THEN
  1653. *
  1654. *                       Check the result column by column.
  1655. *
  1656.                         IF( INCX.GT.0 )THEN
  1657.                            DO 50 I = 1, M
  1658.                               Z( I ) = X( I )
  1659.    50                      CONTINUE
  1660.                         ELSE
  1661.                            DO 60 I = 1, M
  1662.                               Z( I ) = X( M - I + 1 )
  1663.    60                      CONTINUE
  1664.                         END IF
  1665.                         DO 70 J = 1, N
  1666.                            IF( INCY.GT.0 )THEN
  1667.                               W( 1 ) = Y( J )
  1668.                            ELSE
  1669.                               W( 1 ) = Y( N - J + 1 )
  1670.                            END IF
  1671.                            IF( CONJ )
  1672.      $                        W( 1 ) = DCONJG( W( 1 ) )
  1673.                            CALL ZMVCH( 'N', M, 1, ALPHA, Z, NMAX, W, 1,
  1674.      $                                 ONE, A( 1, J ), 1, YT, G,
  1675.      $                                 AA( 1 + ( J - 1 )*LDA ), EPS,
  1676.      $                                 ERR, FATAL, NOUT, .TRUE. )
  1677.                            ERRMAX = MAX( ERRMAX, ERR )
  1678. *                          If got really bad answer, report and return.
  1679.                            IF( FATAL )
  1680.      $                        GO TO 130
  1681.    70                   CONTINUE
  1682.                      ELSE
  1683. *                       Avoid repeating tests with M.le.0 or N.le.0.
  1684.                         GO TO 110
  1685.                      END IF
  1686. *
  1687.    80             CONTINUE
  1688. *
  1689.    90          CONTINUE
  1690. *
  1691.   100       CONTINUE
  1692. *
  1693.   110    CONTINUE
  1694. *
  1695.   120 CONTINUE
  1696. *
  1697. *     Report result.
  1698. *
  1699.       IF( ERRMAX.LT.THRESH )THEN
  1700.          WRITE( NOUT, FMT = 9999 )SNAME, NC
  1701.       ELSE
  1702.          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
  1703.       END IF
  1704.       GO TO 150
  1705. *
  1706.   130 CONTINUE
  1707.       WRITE( NOUT, FMT = 9995 )J
  1708. *
  1709.   140 CONTINUE
  1710.       WRITE( NOUT, FMT = 9996 )SNAME
  1711.       WRITE( NOUT, FMT = 9994 )NC, SNAME, M, N, ALPHA, INCX, INCY, LDA
  1712. *
  1713.   150 CONTINUE
  1714.       RETURN
  1715. *
  1716.  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
  1717.      $      'S)' )
  1718.  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  1719.      $      'ANGED INCORRECTLY *******' )
  1720.  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
  1721.      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
  1722.      $      ' - SUSPECT *******' )
  1723.  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
  1724.  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
  1725.  9994 FORMAT( 1X, I6, ': ', A6, '(', 2( I3, ',' ), '(', F4.1, ',', F4.1,
  1726.      $      '), X,', I2, ', Y,', I2, ', A,', I3, ')                   ',
  1727.      $      '      .' )
  1728.  9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  1729.      $      '******' )
  1730. *
  1731. *     End of ZCHK4.
  1732. *
  1733.       END
  1734.       SUBROUTINE ZCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  1735.      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
  1736.      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
  1737.      $                  Z )
  1738. *
  1739. *  Tests ZHER and ZHPR.
  1740. *
  1741. *  Auxiliary routine for test program for Level 2 Blas.
  1742. *
  1743. *  -- Written on 10-August-1987.
  1744. *     Richard Hanson, Sandia National Labs.
  1745. *     Jeremy Du Croz, NAG Central Office.
  1746. *
  1747. *     .. Parameters ..
  1748.       COMPLEX*16         ZERO, HALF, ONE
  1749.       PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),
  1750.      $                   HALF = ( 0.5D0, 0.0D0 ),
  1751.      $                   ONE = ( 1.0D0, 0.0D0 ) )
  1752.       DOUBLE PRECISION   RZERO
  1753.       PARAMETER          ( RZERO = 0.0D0 )
  1754. *     .. Scalar Arguments ..
  1755.       DOUBLE PRECISION   EPS, THRESH
  1756.       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA
  1757.       LOGICAL            FATAL, REWI, TRACE
  1758.       CHARACTER*6        SNAME
  1759. *     .. Array Arguments ..
  1760.       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
  1761.      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
  1762.      $                   XX( NMAX*INCMAX ), Y( NMAX ),
  1763.      $                   YS( NMAX*INCMAX ), YT( NMAX ),
  1764.      $                   YY( NMAX*INCMAX ), Z( NMAX )
  1765.       DOUBLE PRECISION   G( NMAX )
  1766.       INTEGER            IDIM( NIDIM ), INC( NINC )
  1767. *     .. Local Scalars ..
  1768.       COMPLEX*16         ALPHA, TRANSL
  1769.       DOUBLE PRECISION   ERR, ERRMAX, RALPHA, RALS
  1770.       INTEGER            I, IA, IC, IN, INCX, INCXS, IX, J, JA, JJ, LAA,
  1771.      $                   LDA, LDAS, LJ, LX, N, NARGS, NC, NS
  1772.       LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER
  1773.       CHARACTER*1        UPLO, UPLOS
  1774.       CHARACTER*2        ICH
  1775. *     .. Local Arrays ..
  1776.       COMPLEX*16         W( 1 )
  1777.       LOGICAL            ISAME( 13 )
  1778. *     .. External Functions ..
  1779.       LOGICAL            LZE, LZERES
  1780.       EXTERNAL           LZE, LZERES
  1781. *     .. External Subroutines ..
  1782.       EXTERNAL           ZHER, ZHPR, ZMAKE, ZMVCH
  1783. *     .. Intrinsic Functions ..
  1784.       INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, MAX
  1785. *     .. Scalars in Common ..
  1786.       INTEGER            INFOT, NOUTC
  1787.       LOGICAL            LERR, OK
  1788. *     .. Common blocks ..
  1789.       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
  1790. *     .. Data statements ..
  1791.       DATA               ICH/'UL'/
  1792. *     .. Executable Statements ..
  1793.       FULL = SNAME( 3: 3 ).EQ.'E'
  1794.       PACKED = SNAME( 3: 3 ).EQ.'P'
  1795. *     Define the number of arguments.
  1796.       IF( FULL )THEN
  1797.          NARGS = 7
  1798.       ELSE IF( PACKED )THEN
  1799.          NARGS = 6
  1800.       END IF
  1801. *
  1802.       NC = 0
  1803.       RESET = .TRUE.
  1804.       ERRMAX = RZERO
  1805. *
  1806.       DO 100 IN = 1, NIDIM
  1807.          N = IDIM( IN )
  1808. *        Set LDA to 1 more than minimum value if room.
  1809.          LDA = N
  1810.          IF( LDA.LT.NMAX )
  1811.      $      LDA = LDA + 1
  1812. *        Skip tests if not enough room.
  1813.          IF( LDA.GT.NMAX )
  1814.      $      GO TO 100
  1815.          IF( PACKED )THEN
  1816.             LAA = ( N*( N + 1 ) )/2
  1817.          ELSE
  1818.             LAA = LDA*N
  1819.          END IF
  1820. *
  1821.          DO 90 IC = 1, 2
  1822.             UPLO = ICH( IC: IC )
  1823.             UPPER = UPLO.EQ.'U'
  1824. *
  1825.             DO 80 IX = 1, NINC
  1826.                INCX = INC( IX )
  1827.                LX = ABS( INCX )*N
  1828. *
  1829. *              Generate the vector X.
  1830. *
  1831.                TRANSL = HALF
  1832.                CALL ZMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),
  1833.      $                     0, N - 1, RESET, TRANSL )
  1834.                IF( N.GT.1 )THEN
  1835.                   X( N/2 ) = ZERO
  1836.                   XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
  1837.                END IF
  1838. *
  1839.                DO 70 IA = 1, NALF
  1840.                   RALPHA = DBLE( ALF( IA ) )
  1841.                   ALPHA = DCMPLX( RALPHA, RZERO )
  1842.                   NULL = N.LE.0.OR.RALPHA.EQ.RZERO
  1843. *
  1844. *                 Generate the matrix A.
  1845. *
  1846.                   TRANSL = ZERO
  1847.                   CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A, NMAX,
  1848.      $                        AA, LDA, N - 1, N - 1, RESET, TRANSL )
  1849. *
  1850.                   NC = NC + 1
  1851. *
  1852. *                 Save every datum before calling the subroutine.
  1853. *
  1854.                   UPLOS = UPLO
  1855.                   NS = N
  1856.                   RALS = RALPHA
  1857.                   DO 10 I = 1, LAA
  1858.                      AS( I ) = AA( I )
  1859.    10             CONTINUE
  1860.                   LDAS = LDA
  1861.                   DO 20 I = 1, LX
  1862.                      XS( I ) = XX( I )
  1863.    20             CONTINUE
  1864.                   INCXS = INCX
  1865. *
  1866. *                 Call the subroutine.
  1867. *
  1868.                   IF( FULL )THEN
  1869.                      IF( TRACE )
  1870.      $                  WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,
  1871.      $                  RALPHA, INCX, LDA
  1872.                      IF( REWI )
  1873.      $                  REWIND NTRA
  1874.                      CALL ZHER( UPLO, N, RALPHA, XX, INCX, AA, LDA )
  1875.                   ELSE IF( PACKED )THEN
  1876.                      IF( TRACE )
  1877.      $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,
  1878.      $                  RALPHA, INCX
  1879.                      IF( REWI )
  1880.      $                  REWIND NTRA
  1881.                      CALL ZHPR( UPLO, N, RALPHA, XX, INCX, AA )
  1882.                   END IF
  1883. *
  1884. *                 Check if error-exit was taken incorrectly.
  1885. *
  1886.                   IF( .NOT.OK )THEN
  1887.                      WRITE( NOUT, FMT = 9992 )
  1888.                      FATAL = .TRUE.
  1889.                      GO TO 120
  1890.                   END IF
  1891. *
  1892. *                 See what data changed inside subroutines.
  1893. *
  1894.                   ISAME( 1 ) = UPLO.EQ.UPLOS
  1895.                   ISAME( 2 ) = NS.EQ.N
  1896.                   ISAME( 3 ) = RALS.EQ.RALPHA
  1897.                   ISAME( 4 ) = LZE( XS, XX, LX )
  1898.                   ISAME( 5 ) = INCXS.EQ.INCX
  1899.                   IF( NULL )THEN
  1900.                      ISAME( 6 ) = LZE( AS, AA, LAA )
  1901.                   ELSE
  1902.                      ISAME( 6 ) = LZERES( SNAME( 2: 3 ), UPLO, N, N, AS,
  1903.      $                            AA, LDA )
  1904.                   END IF
  1905.                   IF( .NOT.PACKED )THEN
  1906.                      ISAME( 7 ) = LDAS.EQ.LDA
  1907.                   END IF
  1908. *
  1909. *                 If data was incorrectly changed, report and return.
  1910. *
  1911.                   SAME = .TRUE.
  1912.                   DO 30 I = 1, NARGS
  1913.                      SAME = SAME.AND.ISAME( I )
  1914.                      IF( .NOT.ISAME( I ) )
  1915.      $                  WRITE( NOUT, FMT = 9998 )I
  1916.    30             CONTINUE
  1917.                   IF( .NOT.SAME )THEN
  1918.                      FATAL = .TRUE.
  1919.                      GO TO 120
  1920.                   END IF
  1921. *
  1922.                   IF( .NOT.NULL )THEN
  1923. *
  1924. *                    Check the result column by column.
  1925. *
  1926.                      IF( INCX.GT.0 )THEN
  1927.                         DO 40 I = 1, N
  1928.                            Z( I ) = X( I )
  1929.    40                   CONTINUE
  1930.                      ELSE
  1931.                         DO 50 I = 1, N
  1932.                            Z( I ) = X( N - I + 1 )
  1933.    50                   CONTINUE
  1934.                      END IF
  1935.                      JA = 1
  1936.                      DO 60 J = 1, N
  1937.                         W( 1 ) = DCONJG( Z( J ) )
  1938.                         IF( UPPER )THEN
  1939.                            JJ = 1
  1940.                            LJ = J
  1941.                         ELSE
  1942.                            JJ = J
  1943.                            LJ = N - J + 1
  1944.                         END IF
  1945.                         CALL ZMVCH( 'N', LJ, 1, ALPHA, Z( JJ ), LJ, W,
  1946.      $                              1, ONE, A( JJ, J ), 1, YT, G,
  1947.      $                              AA( JA ), EPS, ERR, FATAL, NOUT,
  1948.      $                              .TRUE. )
  1949.                         IF( FULL )THEN
  1950.                            IF( UPPER )THEN
  1951.                               JA = JA + LDA
  1952.                            ELSE
  1953.                               JA = JA + LDA + 1
  1954.                            END IF
  1955.                         ELSE
  1956.                            JA = JA + LJ
  1957.                         END IF
  1958.                         ERRMAX = MAX( ERRMAX, ERR )
  1959. *                       If got really bad answer, report and return.
  1960.                         IF( FATAL )
  1961.      $                     GO TO 110
  1962.    60                CONTINUE
  1963.                   ELSE
  1964. *                    Avoid repeating tests if N.le.0.
  1965.                      IF( N.LE.0 )
  1966.      $                  GO TO 100
  1967.                   END IF
  1968. *
  1969.    70          CONTINUE
  1970. *
  1971.    80       CONTINUE
  1972. *
  1973.    90    CONTINUE
  1974. *
  1975.   100 CONTINUE
  1976. *
  1977. *     Report result.
  1978. *
  1979.       IF( ERRMAX.LT.THRESH )THEN
  1980.          WRITE( NOUT, FMT = 9999 )SNAME, NC
  1981.       ELSE
  1982.          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
  1983.       END IF
  1984.       GO TO 130
  1985. *
  1986.   110 CONTINUE
  1987.       WRITE( NOUT, FMT = 9995 )J
  1988. *
  1989.   120 CONTINUE
  1990.       WRITE( NOUT, FMT = 9996 )SNAME
  1991.       IF( FULL )THEN
  1992.          WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, RALPHA, INCX, LDA
  1993.       ELSE IF( PACKED )THEN
  1994.          WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, RALPHA, INCX
  1995.       END IF
  1996. *
  1997.   130 CONTINUE
  1998.       RETURN
  1999. *
  2000.  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
  2001.      $      'S)' )
  2002.  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  2003.      $      'ANGED INCORRECTLY *******' )
  2004.  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
  2005.      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
  2006.      $      ' - SUSPECT *******' )
  2007.  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
  2008.  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
  2009.  9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',
  2010.      $      I2, ', AP)                                         .' )
  2011.  9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',', F4.1, ', X,',
  2012.      $      I2, ', A,', I3, ')                                      .' )
  2013.  9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  2014.      $      '******' )
  2015. *
  2016. *     End of ZCHK5.
  2017. *
  2018.       END
  2019.       SUBROUTINE ZCHK6( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
  2020.      $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
  2021.      $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
  2022.      $                  Z )
  2023. *
  2024. *  Tests ZHER2 and ZHPR2.
  2025. *
  2026. *  Auxiliary routine for test program for Level 2 Blas.
  2027. *
  2028. *  -- Written on 10-August-1987.
  2029. *     Richard Hanson, Sandia National Labs.
  2030. *     Jeremy Du Croz, NAG Central Office.
  2031. *
  2032. *     .. Parameters ..
  2033.       COMPLEX*16         ZERO, HALF, ONE
  2034.       PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),
  2035.      $                   HALF = ( 0.5D0, 0.0D0 ),
  2036.      $                   ONE = ( 1.0D0, 0.0D0 ) )
  2037.       DOUBLE PRECISION   RZERO
  2038.       PARAMETER          ( RZERO = 0.0D0 )
  2039. *     .. Scalar Arguments ..
  2040.       DOUBLE PRECISION   EPS, THRESH
  2041.       INTEGER            INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA
  2042.       LOGICAL            FATAL, REWI, TRACE
  2043.       CHARACTER*6        SNAME
  2044. *     .. Array Arguments ..
  2045.       COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
  2046.      $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),
  2047.      $                   XX( NMAX*INCMAX ), Y( NMAX ),
  2048.      $                   YS( NMAX*INCMAX ), YT( NMAX ),
  2049.      $                   YY( NMAX*INCMAX ), Z( NMAX, 2 )
  2050.       DOUBLE PRECISION   G( NMAX )
  2051.       INTEGER            IDIM( NIDIM ), INC( NINC )
  2052. *     .. Local Scalars ..
  2053.       COMPLEX*16         ALPHA, ALS, TRANSL
  2054.       DOUBLE PRECISION   ERR, ERRMAX
  2055.       INTEGER            I, IA, IC, IN, INCX, INCXS, INCY, INCYS, IX,
  2056.      $                   IY, J, JA, JJ, LAA, LDA, LDAS, LJ, LX, LY, N,
  2057.      $                   NARGS, NC, NS
  2058.       LOGICAL            FULL, NULL, PACKED, RESET, SAME, UPPER
  2059.       CHARACTER*1        UPLO, UPLOS
  2060.       CHARACTER*2        ICH
  2061. *     .. Local Arrays ..
  2062.       COMPLEX*16         W( 2 )
  2063.       LOGICAL            ISAME( 13 )
  2064. *     .. External Functions ..
  2065.       LOGICAL            LZE, LZERES
  2066.       EXTERNAL           LZE, LZERES
  2067. *     .. External Subroutines ..
  2068.       EXTERNAL           ZHER2, ZHPR2, ZMAKE, ZMVCH
  2069. *     .. Intrinsic Functions ..
  2070.       INTRINSIC          ABS, DCONJG, MAX
  2071. *     .. Scalars in Common ..
  2072.       INTEGER            INFOT, NOUTC
  2073.       LOGICAL            LERR, OK
  2074. *     .. Common blocks ..
  2075.       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
  2076. *     .. Data statements ..
  2077.       DATA               ICH/'UL'/
  2078. *     .. Executable Statements ..
  2079.       FULL = SNAME( 3: 3 ).EQ.'E'
  2080.       PACKED = SNAME( 3: 3 ).EQ.'P'
  2081. *     Define the number of arguments.
  2082.       IF( FULL )THEN
  2083.          NARGS = 9
  2084.       ELSE IF( PACKED )THEN
  2085.          NARGS = 8
  2086.       END IF
  2087. *
  2088.       NC = 0
  2089.       RESET = .TRUE.
  2090.       ERRMAX = RZERO
  2091. *
  2092.       DO 140 IN = 1, NIDIM
  2093.          N = IDIM( IN )
  2094. *        Set LDA to 1 more than minimum value if room.
  2095.          LDA = N
  2096.          IF( LDA.LT.NMAX )
  2097.      $      LDA = LDA + 1
  2098. *        Skip tests if not enough room.
  2099.          IF( LDA.GT.NMAX )
  2100.      $      GO TO 140
  2101.          IF( PACKED )THEN
  2102.             LAA = ( N*( N + 1 ) )/2
  2103.          ELSE
  2104.             LAA = LDA*N
  2105.          END IF
  2106. *
  2107.          DO 130 IC = 1, 2
  2108.             UPLO = ICH( IC: IC )
  2109.             UPPER = UPLO.EQ.'U'
  2110. *
  2111.             DO 120 IX = 1, NINC
  2112.                INCX = INC( IX )
  2113.                LX = ABS( INCX )*N
  2114. *
  2115. *              Generate the vector X.
  2116. *
  2117.                TRANSL = HALF
  2118.                CALL ZMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX, ABS( INCX ),
  2119.      $                     0, N - 1, RESET, TRANSL )
  2120.                IF( N.GT.1 )THEN
  2121.                   X( N/2 ) = ZERO
  2122.                   XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO
  2123.                END IF
  2124. *
  2125.                DO 110 IY = 1, NINC
  2126.                   INCY = INC( IY )
  2127.                   LY = ABS( INCY )*N
  2128. *
  2129. *                 Generate the vector Y.
  2130. *
  2131.                   TRANSL = ZERO
  2132.                   CALL ZMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,
  2133.      $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )
  2134.                   IF( N.GT.1 )THEN
  2135.                      Y( N/2 ) = ZERO
  2136.                      YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO
  2137.                   END IF
  2138. *
  2139.                   DO 100 IA = 1, NALF
  2140.                      ALPHA = ALF( IA )
  2141.                      NULL = N.LE.0.OR.ALPHA.EQ.ZERO
  2142. *
  2143. *                    Generate the matrix A.
  2144. *
  2145.                      TRANSL = ZERO
  2146.                      CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', N, N, A,
  2147.      $                           NMAX, AA, LDA, N - 1, N - 1, RESET,
  2148.      $                           TRANSL )
  2149. *
  2150.                      NC = NC + 1
  2151. *
  2152. *                    Save every datum before calling the subroutine.
  2153. *
  2154.                      UPLOS = UPLO
  2155.                      NS = N
  2156.                      ALS = ALPHA
  2157.                      DO 10 I = 1, LAA
  2158.                         AS( I ) = AA( I )
  2159.    10                CONTINUE
  2160.                      LDAS = LDA
  2161.                      DO 20 I = 1, LX
  2162.                         XS( I ) = XX( I )
  2163.    20                CONTINUE
  2164.                      INCXS = INCX
  2165.                      DO 30 I = 1, LY
  2166.                         YS( I ) = YY( I )
  2167.    30                CONTINUE
  2168.                      INCYS = INCY
  2169. *
  2170. *                    Call the subroutine.
  2171. *
  2172.                      IF( FULL )THEN
  2173.                         IF( TRACE )
  2174.      $                     WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO, N,
  2175.      $                     ALPHA, INCX, INCY, LDA
  2176.                         IF( REWI )
  2177.      $                     REWIND NTRA
  2178.                         CALL ZHER2( UPLO, N, ALPHA, XX, INCX, YY, INCY,
  2179.      $                              AA, LDA )
  2180.                      ELSE IF( PACKED )THEN
  2181.                         IF( TRACE )
  2182.      $                     WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO, N,
  2183.      $                     ALPHA, INCX, INCY
  2184.                         IF( REWI )
  2185.      $                     REWIND NTRA
  2186.                         CALL ZHPR2( UPLO, N, ALPHA, XX, INCX, YY, INCY,
  2187.      $                              AA )
  2188.                      END IF
  2189. *
  2190. *                    Check if error-exit was taken incorrectly.
  2191. *
  2192.                      IF( .NOT.OK )THEN
  2193.                         WRITE( NOUT, FMT = 9992 )
  2194.                         FATAL = .TRUE.
  2195.                         GO TO 160
  2196.                      END IF
  2197. *
  2198. *                    See what data changed inside subroutines.
  2199. *
  2200.                      ISAME( 1 ) = UPLO.EQ.UPLOS
  2201.                      ISAME( 2 ) = NS.EQ.N
  2202.                      ISAME( 3 ) = ALS.EQ.ALPHA
  2203.                      ISAME( 4 ) = LZE( XS, XX, LX )
  2204.                      ISAME( 5 ) = INCXS.EQ.INCX
  2205.                      ISAME( 6 ) = LZE( YS, YY, LY )
  2206.                      ISAME( 7 ) = INCYS.EQ.INCY
  2207.                      IF( NULL )THEN
  2208.                         ISAME( 8 ) = LZE( AS, AA, LAA )
  2209.                      ELSE
  2210.                         ISAME( 8 ) = LZERES( SNAME( 2: 3 ), UPLO, N, N,
  2211.      $                               AS, AA, LDA )
  2212.                      END IF
  2213.                      IF( .NOT.PACKED )THEN
  2214.                         ISAME( 9 ) = LDAS.EQ.LDA
  2215.                      END IF
  2216. *
  2217. *                    If data was incorrectly changed, report and return.
  2218. *
  2219.                      SAME = .TRUE.
  2220.                      DO 40 I = 1, NARGS
  2221.                         SAME = SAME.AND.ISAME( I )
  2222.                         IF( .NOT.ISAME( I ) )
  2223.      $                     WRITE( NOUT, FMT = 9998 )I
  2224.    40                CONTINUE
  2225.                      IF( .NOT.SAME )THEN
  2226.                         FATAL = .TRUE.
  2227.                         GO TO 160
  2228.                      END IF
  2229. *
  2230.                      IF( .NOT.NULL )THEN
  2231. *
  2232. *                       Check the result column by column.
  2233. *
  2234.                         IF( INCX.GT.0 )THEN
  2235.                            DO 50 I = 1, N
  2236.                               Z( I, 1 ) = X( I )
  2237.    50                      CONTINUE
  2238.                         ELSE
  2239.                            DO 60 I = 1, N
  2240.                               Z( I, 1 ) = X( N - I + 1 )
  2241.    60                      CONTINUE
  2242.                         END IF
  2243.                         IF( INCY.GT.0 )THEN
  2244.                            DO 70 I = 1, N
  2245.                               Z( I, 2 ) = Y( I )
  2246.    70                      CONTINUE
  2247.                         ELSE
  2248.                            DO 80 I = 1, N
  2249.                               Z( I, 2 ) = Y( N - I + 1 )
  2250.    80                      CONTINUE
  2251.                         END IF
  2252.                         JA = 1
  2253.                         DO 90 J = 1, N
  2254.                            W( 1 ) = ALPHA*DCONJG( Z( J, 2 ) )
  2255.                            W( 2 ) = DCONJG( ALPHA )*DCONJG( Z( J, 1 ) )
  2256.                            IF( UPPER )THEN
  2257.                               JJ = 1
  2258.                               LJ = J
  2259.                            ELSE
  2260.                               JJ = J
  2261.                               LJ = N - J + 1
  2262.                            END IF
  2263.                            CALL ZMVCH( 'N', LJ, 2, ONE, Z( JJ, 1 ),
  2264.      $                                 NMAX, W, 1, ONE, A( JJ, J ), 1,
  2265.      $                                 YT, G, AA( JA ), EPS, ERR, FATAL,
  2266.      $                                 NOUT, .TRUE. )
  2267.                            IF( FULL )THEN
  2268.                               IF( UPPER )THEN
  2269.                                  JA = JA + LDA
  2270.                               ELSE
  2271.                                  JA = JA + LDA + 1
  2272.                               END IF
  2273.                            ELSE
  2274.                               JA = JA + LJ
  2275.                            END IF
  2276.                            ERRMAX = MAX( ERRMAX, ERR )
  2277. *                          If got really bad answer, report and return.
  2278.                            IF( FATAL )
  2279.      $                        GO TO 150
  2280.    90                   CONTINUE
  2281.                      ELSE
  2282. *                       Avoid repeating tests with N.le.0.
  2283.                         IF( N.LE.0 )
  2284.      $                     GO TO 140
  2285.                      END IF
  2286. *
  2287.   100             CONTINUE
  2288. *
  2289.   110          CONTINUE
  2290. *
  2291.   120       CONTINUE
  2292. *
  2293.   130    CONTINUE
  2294. *
  2295.   140 CONTINUE
  2296. *
  2297. *     Report result.
  2298. *
  2299.       IF( ERRMAX.LT.THRESH )THEN
  2300.          WRITE( NOUT, FMT = 9999 )SNAME, NC
  2301.       ELSE
  2302.          WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
  2303.       END IF
  2304.       GO TO 170
  2305. *
  2306.   150 CONTINUE
  2307.       WRITE( NOUT, FMT = 9995 )J
  2308. *
  2309.   160 CONTINUE
  2310.       WRITE( NOUT, FMT = 9996 )SNAME
  2311.       IF( FULL )THEN
  2312.          WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, INCX,
  2313.      $      INCY, LDA
  2314.       ELSE IF( PACKED )THEN
  2315.          WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, ALPHA, INCX, INCY
  2316.       END IF
  2317. *
  2318.   170 CONTINUE
  2319.       RETURN
  2320. *
  2321.  9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
  2322.      $      'S)' )
  2323.  9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
  2324.      $      'ANGED INCORRECTLY *******' )
  2325.  9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
  2326.      $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
  2327.      $      ' - SUSPECT *******' )
  2328.  9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
  2329.  9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 )
  2330.  9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',
  2331.      $      F4.1, '), X,', I2, ', Y,', I2, ', AP)                     ',
  2332.      $      '       .' )
  2333.  9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',
  2334.      $      F4.1, '), X,', I2, ', Y,', I2, ', A,', I3, ')             ',
  2335.      $      '            .' )
  2336.  9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
  2337.      $      '******' )
  2338. *
  2339. *     End of ZCHK6.
  2340. *
  2341.       END
  2342.       SUBROUTINE ZCHKE( ISNUM, SRNAMT, NOUT )
  2343. *
  2344. *  Tests the error exits from the Level 2 Blas.
  2345. *  Requires a special version of the error-handling routine XERBLA.
  2346. *  ALPHA, RALPHA, BETA, A, X and Y should not need to be defined.
  2347. *
  2348. *  Auxiliary routine for test program for Level 2 Blas.
  2349. *
  2350. *  -- Written on 10-August-1987.
  2351. *     Richard Hanson, Sandia National Labs.
  2352. *     Jeremy Du Croz, NAG Central Office.
  2353. *
  2354. *     .. Scalar Arguments ..
  2355.       INTEGER            ISNUM, NOUT
  2356.       CHARACTER*6        SRNAMT
  2357. *     .. Scalars in Common ..
  2358.       INTEGER            INFOT, NOUTC
  2359.       LOGICAL            LERR, OK
  2360. *     .. Local Scalars ..
  2361.       COMPLEX*16         ALPHA, BETA
  2362.       DOUBLE PRECISION   RALPHA
  2363. *     .. Local Arrays ..
  2364.       COMPLEX*16         A( 1, 1 ), X( 1 ), Y( 1 )
  2365. *     .. External Subroutines ..
  2366.       EXTERNAL           CHKXER, ZGBMV, ZGEMV, ZGERC, ZGERU, ZHBMV,
  2367.      $                   ZHEMV, ZHER, ZHER2, ZHPMV, ZHPR, ZHPR2, ZTBMV,
  2368.      $                   ZTBSV, ZTPMV, ZTPSV, ZTRMV, ZTRSV
  2369. *     .. Common blocks ..
  2370.       COMMON             /INFOC/INFOT, NOUTC, OK, LERR
  2371. *     .. Executable Statements ..
  2372. *     OK is set to .FALSE. by the special version of XERBLA or by CHKXER
  2373. *     if anything is wrong.
  2374.       OK = .TRUE.
  2375. *     LERR is set to .TRUE. by the special version of XERBLA each time
  2376. *     it is called, and is then tested and re-set by CHKXER.
  2377.       LERR = .FALSE.
  2378.       GO TO ( 10, 20, 30, 40, 50, 60, 70, 80,
  2379.      $        90, 100, 110, 120, 130, 140, 150, 160,
  2380.      $        170 )ISNUM
  2381.    10 INFOT = 1
  2382.       CALL ZGEMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2383.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2384.       INFOT = 2
  2385.       CALL ZGEMV( 'N', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2386.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2387.       INFOT = 3
  2388.       CALL ZGEMV( 'N', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2389.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2390.       INFOT = 6
  2391.       CALL ZGEMV( 'N', 2, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2392.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2393.       INFOT = 8
  2394.       CALL ZGEMV( 'N', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )
  2395.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2396.       INFOT = 11
  2397.       CALL ZGEMV( 'N', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )
  2398.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2399.       GO TO 180
  2400.    20 INFOT = 1
  2401.       CALL ZGBMV( '/', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2402.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2403.       INFOT = 2
  2404.       CALL ZGBMV( 'N', -1, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2405.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2406.       INFOT = 3
  2407.       CALL ZGBMV( 'N', 0, -1, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2408.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2409.       INFOT = 4
  2410.       CALL ZGBMV( 'N', 0, 0, -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2411.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2412.       INFOT = 5
  2413.       CALL ZGBMV( 'N', 2, 0, 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2414.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2415.       INFOT = 8
  2416.       CALL ZGBMV( 'N', 0, 0, 1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2417.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2418.       INFOT = 10
  2419.       CALL ZGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )
  2420.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2421.       INFOT = 13
  2422.       CALL ZGBMV( 'N', 0, 0, 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )
  2423.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2424.       GO TO 180
  2425.    30 INFOT = 1
  2426.       CALL ZHEMV( '/', 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2427.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2428.       INFOT = 2
  2429.       CALL ZHEMV( 'U', -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2430.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2431.       INFOT = 5
  2432.       CALL ZHEMV( 'U', 2, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2433.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2434.       INFOT = 7
  2435.       CALL ZHEMV( 'U', 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )
  2436.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2437.       INFOT = 10
  2438.       CALL ZHEMV( 'U', 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )
  2439.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2440.       GO TO 180
  2441.    40 INFOT = 1
  2442.       CALL ZHBMV( '/', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2443.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2444.       INFOT = 2
  2445.       CALL ZHBMV( 'U', -1, 0, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2446.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2447.       INFOT = 3
  2448.       CALL ZHBMV( 'U', 0, -1, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2449.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2450.       INFOT = 6
  2451.       CALL ZHBMV( 'U', 0, 1, ALPHA, A, 1, X, 1, BETA, Y, 1 )
  2452.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2453.       INFOT = 8
  2454.       CALL ZHBMV( 'U', 0, 0, ALPHA, A, 1, X, 0, BETA, Y, 1 )
  2455.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2456.       INFOT = 11
  2457.       CALL ZHBMV( 'U', 0, 0, ALPHA, A, 1, X, 1, BETA, Y, 0 )
  2458.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2459.       GO TO 180
  2460.    50 INFOT = 1
  2461.       CALL ZHPMV( '/', 0, ALPHA, A, X, 1, BETA, Y, 1 )
  2462.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2463.       INFOT = 2
  2464.       CALL ZHPMV( 'U', -1, ALPHA, A, X, 1, BETA, Y, 1 )
  2465.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2466.       INFOT = 6
  2467.       CALL ZHPMV( 'U', 0, ALPHA, A, X, 0, BETA, Y, 1 )
  2468.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2469.       INFOT = 9
  2470.       CALL ZHPMV( 'U', 0, ALPHA, A, X, 1, BETA, Y, 0 )
  2471.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2472.       GO TO 180
  2473.    60 INFOT = 1
  2474.       CALL ZTRMV( '/', 'N', 'N', 0, A, 1, X, 1 )
  2475.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2476.       INFOT = 2
  2477.       CALL ZTRMV( 'U', '/', 'N', 0, A, 1, X, 1 )
  2478.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2479.       INFOT = 3
  2480.       CALL ZTRMV( 'U', 'N', '/', 0, A, 1, X, 1 )
  2481.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2482.       INFOT = 4
  2483.       CALL ZTRMV( 'U', 'N', 'N', -1, A, 1, X, 1 )
  2484.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2485.       INFOT = 6
  2486.       CALL ZTRMV( 'U', 'N', 'N', 2, A, 1, X, 1 )
  2487.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2488.       INFOT = 8
  2489.       CALL ZTRMV( 'U', 'N', 'N', 0, A, 1, X, 0 )
  2490.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2491.       GO TO 180
  2492.    70 INFOT = 1
  2493.       CALL ZTBMV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )
  2494.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2495.       INFOT = 2
  2496.       CALL ZTBMV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )
  2497.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2498.       INFOT = 3
  2499.       CALL ZTBMV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )
  2500.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2501.       INFOT = 4
  2502.       CALL ZTBMV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )
  2503.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2504.       INFOT = 5
  2505.       CALL ZTBMV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )
  2506.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2507.       INFOT = 7
  2508.       CALL ZTBMV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )
  2509.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2510.       INFOT = 9
  2511.       CALL ZTBMV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )
  2512.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2513.       GO TO 180
  2514.    80 INFOT = 1
  2515.       CALL ZTPMV( '/', 'N', 'N', 0, A, X, 1 )
  2516.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2517.       INFOT = 2
  2518.       CALL ZTPMV( 'U', '/', 'N', 0, A, X, 1 )
  2519.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2520.       INFOT = 3
  2521.       CALL ZTPMV( 'U', 'N', '/', 0, A, X, 1 )
  2522.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2523.       INFOT = 4
  2524.       CALL ZTPMV( 'U', 'N', 'N', -1, A, X, 1 )
  2525.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2526.       INFOT = 7
  2527.       CALL ZTPMV( 'U', 'N', 'N', 0, A, X, 0 )
  2528.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2529.       GO TO 180
  2530.    90 INFOT = 1
  2531.       CALL ZTRSV( '/', 'N', 'N', 0, A, 1, X, 1 )
  2532.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2533.       INFOT = 2
  2534.       CALL ZTRSV( 'U', '/', 'N', 0, A, 1, X, 1 )
  2535.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2536.       INFOT = 3
  2537.       CALL ZTRSV( 'U', 'N', '/', 0, A, 1, X, 1 )
  2538.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2539.       INFOT = 4
  2540.       CALL ZTRSV( 'U', 'N', 'N', -1, A, 1, X, 1 )
  2541.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2542.       INFOT = 6
  2543.       CALL ZTRSV( 'U', 'N', 'N', 2, A, 1, X, 1 )
  2544.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2545.       INFOT = 8
  2546.       CALL ZTRSV( 'U', 'N', 'N', 0, A, 1, X, 0 )
  2547.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2548.       GO TO 180
  2549.   100 INFOT = 1
  2550.       CALL ZTBSV( '/', 'N', 'N', 0, 0, A, 1, X, 1 )
  2551.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2552.       INFOT = 2
  2553.       CALL ZTBSV( 'U', '/', 'N', 0, 0, A, 1, X, 1 )
  2554.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2555.       INFOT = 3
  2556.       CALL ZTBSV( 'U', 'N', '/', 0, 0, A, 1, X, 1 )
  2557.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2558.       INFOT = 4
  2559.       CALL ZTBSV( 'U', 'N', 'N', -1, 0, A, 1, X, 1 )
  2560.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2561.       INFOT = 5
  2562.       CALL ZTBSV( 'U', 'N', 'N', 0, -1, A, 1, X, 1 )
  2563.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2564.       INFOT = 7
  2565.       CALL ZTBSV( 'U', 'N', 'N', 0, 1, A, 1, X, 1 )
  2566.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2567.       INFOT = 9
  2568.       CALL ZTBSV( 'U', 'N', 'N', 0, 0, A, 1, X, 0 )
  2569.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2570.       GO TO 180
  2571.   110 INFOT = 1
  2572.       CALL ZTPSV( '/', 'N', 'N', 0, A, X, 1 )
  2573.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2574.       INFOT = 2
  2575.       CALL ZTPSV( 'U', '/', 'N', 0, A, X, 1 )
  2576.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2577.       INFOT = 3
  2578.       CALL ZTPSV( 'U', 'N', '/', 0, A, X, 1 )
  2579.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2580.       INFOT = 4
  2581.       CALL ZTPSV( 'U', 'N', 'N', -1, A, X, 1 )
  2582.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2583.       INFOT = 7
  2584.       CALL ZTPSV( 'U', 'N', 'N', 0, A, X, 0 )
  2585.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2586.       GO TO 180
  2587.   120 INFOT = 1
  2588.       CALL ZGERC( -1, 0, ALPHA, X, 1, Y, 1, A, 1 )
  2589.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2590.       INFOT = 2
  2591.       CALL ZGERC( 0, -1, ALPHA, X, 1, Y, 1, A, 1 )
  2592.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2593.       INFOT = 5
  2594.       CALL ZGERC( 0, 0, ALPHA, X, 0, Y, 1, A, 1 )
  2595.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2596.       INFOT = 7
  2597.       CALL ZGERC( 0, 0, ALPHA, X, 1, Y, 0, A, 1 )
  2598.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2599.       INFOT = 9
  2600.       CALL ZGERC( 2, 0, ALPHA, X, 1, Y, 1, A, 1 )
  2601.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2602.       GO TO 180
  2603.   130 INFOT = 1
  2604.       CALL ZGERU( -1, 0, ALPHA, X, 1, Y, 1, A, 1 )
  2605.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2606.       INFOT = 2
  2607.       CALL ZGERU( 0, -1, ALPHA, X, 1, Y, 1, A, 1 )
  2608.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2609.       INFOT = 5
  2610.       CALL ZGERU( 0, 0, ALPHA, X, 0, Y, 1, A, 1 )
  2611.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2612.       INFOT = 7
  2613.       CALL ZGERU( 0, 0, ALPHA, X, 1, Y, 0, A, 1 )
  2614.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2615.       INFOT = 9
  2616.       CALL ZGERU( 2, 0, ALPHA, X, 1, Y, 1, A, 1 )
  2617.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2618.       GO TO 180
  2619.   140 INFOT = 1
  2620.       CALL ZHER( '/', 0, RALPHA, X, 1, A, 1 )
  2621.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2622.       INFOT = 2
  2623.       CALL ZHER( 'U', -1, RALPHA, X, 1, A, 1 )
  2624.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2625.       INFOT = 5
  2626.       CALL ZHER( 'U', 0, RALPHA, X, 0, A, 1 )
  2627.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2628.       INFOT = 7
  2629.       CALL ZHER( 'U', 2, RALPHA, X, 1, A, 1 )
  2630.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2631.       GO TO 180
  2632.   150 INFOT = 1
  2633.       CALL ZHPR( '/', 0, RALPHA, X, 1, A )
  2634.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2635.       INFOT = 2
  2636.       CALL ZHPR( 'U', -1, RALPHA, X, 1, A )
  2637.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2638.       INFOT = 5
  2639.       CALL ZHPR( 'U', 0, RALPHA, X, 0, A )
  2640.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2641.       GO TO 180
  2642.   160 INFOT = 1
  2643.       CALL ZHER2( '/', 0, ALPHA, X, 1, Y, 1, A, 1 )
  2644.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2645.       INFOT = 2
  2646.       CALL ZHER2( 'U', -1, ALPHA, X, 1, Y, 1, A, 1 )
  2647.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2648.       INFOT = 5
  2649.       CALL ZHER2( 'U', 0, ALPHA, X, 0, Y, 1, A, 1 )
  2650.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2651.       INFOT = 7
  2652.       CALL ZHER2( 'U', 0, ALPHA, X, 1, Y, 0, A, 1 )
  2653.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2654.       INFOT = 9
  2655.       CALL ZHER2( 'U', 2, ALPHA, X, 1, Y, 1, A, 1 )
  2656.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2657.       GO TO 180
  2658.   170 INFOT = 1
  2659.       CALL ZHPR2( '/', 0, ALPHA, X, 1, Y, 1, A )
  2660.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2661.       INFOT = 2
  2662.       CALL ZHPR2( 'U', -1, ALPHA, X, 1, Y, 1, A )
  2663.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2664.       INFOT = 5
  2665.       CALL ZHPR2( 'U', 0, ALPHA, X, 0, Y, 1, A )
  2666.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2667.       INFOT = 7
  2668.       CALL ZHPR2( 'U', 0, ALPHA, X, 1, Y, 0, A )
  2669.       CALL CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  2670. *
  2671.   180 IF( OK )THEN
  2672.          WRITE( NOUT, FMT = 9999 )SRNAMT
  2673.       ELSE
  2674.          WRITE( NOUT, FMT = 9998 )SRNAMT
  2675.       END IF
  2676.       RETURN
  2677. *
  2678.  9999 FORMAT( ' ', A6, ' PASSED THE TESTS OF ERROR-EXITS' )
  2679.  9998 FORMAT( ' ******* ', A6, ' FAILED THE TESTS OF ERROR-EXITS *****',
  2680.      $      '**' )
  2681. *
  2682. *     End of ZCHKE.
  2683. *
  2684.       END
  2685.       SUBROUTINE ZMAKE( TYPE, UPLO, DIAG, M, N, A, NMAX, AA, LDA, KL,
  2686.      $                  KU, RESET, TRANSL )
  2687. *
  2688. *  Generates values for an M by N matrix A within the bandwidth
  2689. *  defined by KL and KU.
  2690. *  Stores the values in the array AA in the data structure required
  2691. *  by the routine, with unwanted elements set to rogue value.
  2692. *
  2693. *  TYPE is 'GE', 'GB', 'HE', 'HB', 'HP', 'TR', 'TB' OR 'TP'.
  2694. *
  2695. *  Auxiliary routine for test program for Level 2 Blas.
  2696. *
  2697. *  -- Written on 10-August-1987.
  2698. *     Richard Hanson, Sandia National Labs.
  2699. *     Jeremy Du Croz, NAG Central Office.
  2700. *
  2701. *     .. Parameters ..
  2702.       COMPLEX*16         ZERO, ONE
  2703.       PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),
  2704.      $                   ONE = ( 1.0D0, 0.0D0 ) )
  2705.       COMPLEX*16         ROGUE
  2706.       PARAMETER          ( ROGUE = ( -1.0D10, 1.0D10 ) )
  2707.       DOUBLE PRECISION   RZERO
  2708.       PARAMETER          ( RZERO = 0.0D0 )
  2709.       DOUBLE PRECISION   RROGUE
  2710.       PARAMETER          ( RROGUE = -1.0D10 )
  2711. *     .. Scalar Arguments ..
  2712.       COMPLEX*16         TRANSL
  2713.       INTEGER            KL, KU, LDA, M, N, NMAX
  2714.       LOGICAL            RESET
  2715.       CHARACTER*1        DIAG, UPLO
  2716.       CHARACTER*2        TYPE
  2717. *     .. Array Arguments ..
  2718.       COMPLEX*16         A( NMAX, * ), AA( * )
  2719. *     .. Local Scalars ..
  2720.       INTEGER            I, I1, I2, I3, IBEG, IEND, IOFF, J, JJ, KK
  2721.       LOGICAL            GEN, LOWER, SYM, TRI, UNIT, UPPER
  2722. *     .. External Functions ..
  2723.       COMPLEX*16         ZBEG
  2724.       EXTERNAL           ZBEG
  2725. *     .. Intrinsic Functions ..
  2726.       INTRINSIC          DBLE, DCMPLX, DCONJG, MAX, MIN
  2727. *     .. Executable Statements ..
  2728.       GEN = TYPE( 1: 1 ).EQ.'G'
  2729.       SYM = TYPE( 1: 1 ).EQ.'H'
  2730.       TRI = TYPE( 1: 1 ).EQ.'T'
  2731.       UPPER = ( SYM.OR.TRI ).AND.UPLO.EQ.'U'
  2732.       LOWER = ( SYM.OR.TRI ).AND.UPLO.EQ.'L'
  2733.       UNIT = TRI.AND.DIAG.EQ.'U'
  2734. *
  2735. *     Generate data in array A.
  2736. *
  2737.       DO 20 J = 1, N
  2738.          DO 10 I = 1, M
  2739.             IF( GEN.OR.( UPPER.AND.I.LE.J ).OR.( LOWER.AND.I.GE.J ) )
  2740.      $          THEN
  2741.                IF( ( I.LE.J.AND.J - I.LE.KU ).OR.
  2742.      $             ( I.GE.J.AND.I - J.LE.KL ) )THEN
  2743.                   A( I, J ) = ZBEG( RESET ) + TRANSL
  2744.                ELSE
  2745.                   A( I, J ) = ZERO
  2746.                END IF
  2747.                IF( I.NE.J )THEN
  2748.                   IF( SYM )THEN
  2749.                      A( J, I ) = DCONJG( A( I, J ) )
  2750.                   ELSE IF( TRI )THEN
  2751.                      A( J, I ) = ZERO
  2752.                   END IF
  2753.                END IF
  2754.             END IF
  2755.    10    CONTINUE
  2756.          IF( SYM )
  2757.      $      A( J, J ) = DCMPLX( DBLE( A( J, J ) ), RZERO )
  2758.          IF( TRI )
  2759.      $      A( J, J ) = A( J, J ) + ONE
  2760.          IF( UNIT )
  2761.      $      A( J, J ) = ONE
  2762.    20 CONTINUE
  2763. *
  2764. *     Store elements in array AS in data structure required by routine.
  2765. *
  2766.       IF( TYPE.EQ.'GE' )THEN
  2767.          DO 50 J = 1, N
  2768.             DO 30 I = 1, M
  2769.                AA( I + ( J - 1 )*LDA ) = A( I, J )
  2770.    30       CONTINUE
  2771.             DO 40 I = M + 1, LDA
  2772.                AA( I + ( J - 1 )*LDA ) = ROGUE
  2773.    40       CONTINUE
  2774.    50    CONTINUE
  2775.       ELSE IF( TYPE.EQ.'GB' )THEN
  2776.          DO 90 J = 1, N
  2777.             DO 60 I1 = 1, KU + 1 - J
  2778.                AA( I1 + ( J - 1 )*LDA ) = ROGUE
  2779.    60       CONTINUE
  2780.             DO 70 I2 = I1, MIN( KL + KU + 1, KU + 1 + M - J )
  2781.                AA( I2 + ( J - 1 )*LDA ) = A( I2 + J - KU - 1, J )
  2782.    70       CONTINUE
  2783.             DO 80 I3 = I2, LDA
  2784.                AA( I3 + ( J - 1 )*LDA ) = ROGUE
  2785.    80       CONTINUE
  2786.    90    CONTINUE
  2787.       ELSE IF( TYPE.EQ.'HE'.OR.TYPE.EQ.'TR' )THEN
  2788.          DO 130 J = 1, N
  2789.             IF( UPPER )THEN
  2790.                IBEG = 1
  2791.                IF( UNIT )THEN
  2792.                   IEND = J - 1
  2793.                ELSE
  2794.                   IEND = J
  2795.                END IF
  2796.             ELSE
  2797.                IF( UNIT )THEN
  2798.                   IBEG = J + 1
  2799.                ELSE
  2800.                   IBEG = J
  2801.                END IF
  2802.                IEND = N
  2803.             END IF
  2804.             DO 100 I = 1, IBEG - 1
  2805.                AA( I + ( J - 1 )*LDA ) = ROGUE
  2806.   100       CONTINUE
  2807.             DO 110 I = IBEG, IEND
  2808.                AA( I + ( J - 1 )*LDA ) = A( I, J )
  2809.   110       CONTINUE
  2810.             DO 120 I = IEND + 1, LDA
  2811.                AA( I + ( J - 1 )*LDA ) = ROGUE
  2812.   120       CONTINUE
  2813.             IF( SYM )THEN
  2814.                JJ = J + ( J - 1 )*LDA
  2815.                AA( JJ ) = DCMPLX( DBLE( AA( JJ ) ), RROGUE )
  2816.             END IF
  2817.   130    CONTINUE
  2818.       ELSE IF( TYPE.EQ.'HB'.OR.TYPE.EQ.'TB' )THEN
  2819.          DO 170 J = 1, N
  2820.             IF( UPPER )THEN
  2821.                KK = KL + 1
  2822.                IBEG = MAX( 1, KL + 2 - J )
  2823.                IF( UNIT )THEN
  2824.                   IEND = KL
  2825.                ELSE
  2826.                   IEND = KL + 1
  2827.                END IF
  2828.             ELSE
  2829.                KK = 1
  2830.                IF( UNIT )THEN
  2831.                   IBEG = 2
  2832.                ELSE
  2833.                   IBEG = 1
  2834.                END IF
  2835.                IEND = MIN( KL + 1, 1 + M - J )
  2836.             END IF
  2837.             DO 140 I = 1, IBEG - 1
  2838.                AA( I + ( J - 1 )*LDA ) = ROGUE
  2839.   140       CONTINUE
  2840.             DO 150 I = IBEG, IEND
  2841.                AA( I + ( J - 1 )*LDA ) = A( I + J - KK, J )
  2842.   150       CONTINUE
  2843.             DO 160 I = IEND + 1, LDA
  2844.                AA( I + ( J - 1 )*LDA ) = ROGUE
  2845.   160       CONTINUE
  2846.             IF( SYM )THEN
  2847.                JJ = KK + ( J - 1 )*LDA
  2848.                AA( JJ ) = DCMPLX( DBLE( AA( JJ ) ), RROGUE )
  2849.             END IF
  2850.   170    CONTINUE
  2851.       ELSE IF( TYPE.EQ.'HP'.OR.TYPE.EQ.'TP' )THEN
  2852.          IOFF = 0
  2853.          DO 190 J = 1, N
  2854.             IF( UPPER )THEN
  2855.                IBEG = 1
  2856.                IEND = J
  2857.             ELSE
  2858.                IBEG = J
  2859.                IEND = N
  2860.             END IF
  2861.             DO 180 I = IBEG, IEND
  2862.                IOFF = IOFF + 1
  2863.                AA( IOFF ) = A( I, J )
  2864.                IF( I.EQ.J )THEN
  2865.                   IF( UNIT )
  2866.      $               AA( IOFF ) = ROGUE
  2867.                   IF( SYM )
  2868.      $               AA( IOFF ) = DCMPLX( DBLE( AA( IOFF ) ), RROGUE )
  2869.                END IF
  2870.   180       CONTINUE
  2871.   190    CONTINUE
  2872.       END IF
  2873.       RETURN
  2874. *
  2875. *     End of ZMAKE.
  2876. *
  2877.       END
  2878.       SUBROUTINE ZMVCH( TRANS, M, N, ALPHA, A, NMAX, X, INCX, BETA, Y,
  2879.      $                  INCY, YT, G, YY, EPS, ERR, FATAL, NOUT, MV )
  2880. *
  2881. *  Checks the results of the computational tests.
  2882. *
  2883. *  Auxiliary routine for test program for Level 2 Blas.
  2884. *
  2885. *  -- Written on 10-August-1987.
  2886. *     Richard Hanson, Sandia National Labs.
  2887. *     Jeremy Du Croz, NAG Central Office.
  2888. *
  2889. *     .. Parameters ..
  2890.       COMPLEX*16         ZERO
  2891.       PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ) )
  2892.       DOUBLE PRECISION   RZERO, RONE
  2893.       PARAMETER          ( RZERO = 0.0D0, RONE = 1.0D0 )
  2894. *     .. Scalar Arguments ..
  2895.       COMPLEX*16         ALPHA, BETA
  2896.       DOUBLE PRECISION   EPS, ERR
  2897.       INTEGER            INCX, INCY, M, N, NMAX, NOUT
  2898.       LOGICAL            FATAL, MV
  2899.       CHARACTER*1        TRANS
  2900. *     .. Array Arguments ..
  2901.       COMPLEX*16         A( NMAX, * ), X( * ), Y( * ), YT( * ), YY( * )
  2902.       DOUBLE PRECISION   G( * )
  2903. *     .. Local Scalars ..
  2904.       COMPLEX*16         C
  2905.       DOUBLE PRECISION   ERRI
  2906.       INTEGER            I, INCXL, INCYL, IY, J, JX, KX, KY, ML, NL
  2907.       LOGICAL            CTRAN, TRAN
  2908. *     .. Intrinsic Functions ..
  2909.       INTRINSIC          ABS, DBLE, DCONJG, DIMAG, MAX, SQRT
  2910. *     .. Statement Functions ..
  2911.       DOUBLE PRECISION   ABS1
  2912. *     .. Statement Function definitions ..
  2913.       ABS1( C ) = ABS( DBLE( C ) ) + ABS( DIMAG( C ) )
  2914. *     .. Executable Statements ..
  2915.       TRAN = TRANS.EQ.'T'
  2916.       CTRAN = TRANS.EQ.'C'
  2917.       IF( TRAN.OR.CTRAN )THEN
  2918.          ML = N
  2919.          NL = M
  2920.       ELSE
  2921.          ML = M
  2922.          NL = N
  2923.       END IF
  2924.       IF( INCX.LT.0 )THEN
  2925.          KX = NL
  2926.          INCXL = -1
  2927.       ELSE
  2928.          KX = 1
  2929.          INCXL = 1
  2930.       END IF
  2931.       IF( INCY.LT.0 )THEN
  2932.          KY = ML
  2933.          INCYL = -1
  2934.       ELSE
  2935.          KY = 1
  2936.          INCYL = 1
  2937.       END IF
  2938. *
  2939. *     Compute expected result in YT using data in A, X and Y.
  2940. *     Compute gauges in G.
  2941. *
  2942.       IY = KY
  2943.       DO 40 I = 1, ML
  2944.          YT( IY ) = ZERO
  2945.          G( IY ) = RZERO
  2946.          JX = KX
  2947.          IF( TRAN )THEN
  2948.             DO 10 J = 1, NL
  2949.                YT( IY ) = YT( IY ) + A( J, I )*X( JX )
  2950.                G( IY ) = G( IY ) + ABS1( A( J, I ) )*ABS1( X( JX ) )
  2951.                JX = JX + INCXL
  2952.    10       CONTINUE
  2953.          ELSE IF( CTRAN )THEN
  2954.             DO 20 J = 1, NL
  2955.                YT( IY ) = YT( IY ) + DCONJG( A( J, I ) )*X( JX )
  2956.                G( IY ) = G( IY ) + ABS1( A( J, I ) )*ABS1( X( JX ) )
  2957.                JX = JX + INCXL
  2958.    20       CONTINUE
  2959.          ELSE
  2960.             DO 30 J = 1, NL
  2961.                YT( IY ) = YT( IY ) + A( I, J )*X( JX )
  2962.                G( IY ) = G( IY ) + ABS1( A( I, J ) )*ABS1( X( JX ) )
  2963.                JX = JX + INCXL
  2964.    30       CONTINUE
  2965.          END IF
  2966.          YT( IY ) = ALPHA*YT( IY ) + BETA*Y( IY )
  2967.          G( IY ) = ABS1( ALPHA )*G( IY ) + ABS1( BETA )*ABS1( Y( IY ) )
  2968.          IY = IY + INCYL
  2969.    40 CONTINUE
  2970. *
  2971. *     Compute the error ratio for this result.
  2972. *
  2973.       ERR = ZERO
  2974.       DO 50 I = 1, ML
  2975.          ERRI = ABS( YT( I ) - YY( 1 + ( I - 1 )*ABS( INCY ) ) )/EPS
  2976.          IF( G( I ).NE.RZERO )
  2977.      $      ERRI = ERRI/G( I )
  2978.          ERR = MAX( ERR, ERRI )
  2979.          IF( ERR*SQRT( EPS ).GE.RONE )
  2980.      $      GO TO 60
  2981.    50 CONTINUE
  2982. *     If the loop completes, all results are at least half accurate.
  2983.       GO TO 80
  2984. *
  2985. *     Report fatal error.
  2986. *
  2987.    60 FATAL = .TRUE.
  2988.       WRITE( NOUT, FMT = 9999 )
  2989.       DO 70 I = 1, ML
  2990.          IF( MV )THEN
  2991.             WRITE( NOUT, FMT = 9998 )I, YT( I ),
  2992.      $         YY( 1 + ( I - 1 )*ABS( INCY ) )
  2993.          ELSE
  2994.             WRITE( NOUT, FMT = 9998 )I,
  2995.      $         YY( 1 + ( I - 1 )*ABS( INCY ) ), YT( I )
  2996.          END IF
  2997.    70 CONTINUE
  2998. *
  2999.    80 CONTINUE
  3000.       RETURN
  3001. *
  3002.  9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
  3003.      $      'F ACCURATE *******', /'                       EXPECTED RE',
  3004.      $      'SULT                    COMPUTED RESULT' )
  3005.  9998 FORMAT( 1X, I7, 2( '  (', G15.6, ',', G15.6, ')' ) )
  3006. *
  3007. *     End of ZMVCH.
  3008. *
  3009.       END
  3010.       LOGICAL FUNCTION LZE( RI, RJ, LR )
  3011. *
  3012. *  Tests if two arrays are identical.
  3013. *
  3014. *  Auxiliary routine for test program for Level 2 Blas.
  3015. *
  3016. *  -- Written on 10-August-1987.
  3017. *     Richard Hanson, Sandia National Labs.
  3018. *     Jeremy Du Croz, NAG Central Office.
  3019. *
  3020. *     .. Scalar Arguments ..
  3021.       INTEGER            LR
  3022. *     .. Array Arguments ..
  3023.       COMPLEX*16         RI( * ), RJ( * )
  3024. *     .. Local Scalars ..
  3025.       INTEGER            I
  3026. *     .. Executable Statements ..
  3027.       DO 10 I = 1, LR
  3028.          IF( RI( I ).NE.RJ( I ) )
  3029.      $      GO TO 20
  3030.    10 CONTINUE
  3031.       LZE = .TRUE.
  3032.       GO TO 30
  3033.    20 CONTINUE
  3034.       LZE = .FALSE.
  3035.    30 RETURN
  3036. *
  3037. *     End of LZE.
  3038. *
  3039.       END
  3040.       LOGICAL FUNCTION LZERES( TYPE, UPLO, M, N, AA, AS, LDA )
  3041. *
  3042. *  Tests if selected elements in two arrays are equal.
  3043. *
  3044. *  TYPE is 'GE', 'HE' or 'HP'.
  3045. *
  3046. *  Auxiliary routine for test program for Level 2 Blas.
  3047. *
  3048. *  -- Written on 10-August-1987.
  3049. *     Richard Hanson, Sandia National Labs.
  3050. *     Jeremy Du Croz, NAG Central Office.
  3051. *
  3052. *     .. Scalar Arguments ..
  3053.       INTEGER            LDA, M, N
  3054.       CHARACTER*1        UPLO
  3055.       CHARACTER*2        TYPE
  3056. *     .. Array Arguments ..
  3057.       COMPLEX*16         AA( LDA, * ), AS( LDA, * )
  3058. *     .. Local Scalars ..
  3059.       INTEGER            I, IBEG, IEND, J
  3060.       LOGICAL            UPPER
  3061. *     .. Executable Statements ..
  3062.       UPPER = UPLO.EQ.'U'
  3063.       IF( TYPE.EQ.'GE' )THEN
  3064.          DO 20 J = 1, N
  3065.             DO 10 I = M + 1, LDA
  3066.                IF( AA( I, J ).NE.AS( I, J ) )
  3067.      $            GO TO 70
  3068.    10       CONTINUE
  3069.    20    CONTINUE
  3070.       ELSE IF( TYPE.EQ.'HE' )THEN
  3071.          DO 50 J = 1, N
  3072.             IF( UPPER )THEN
  3073.                IBEG = 1
  3074.                IEND = J
  3075.             ELSE
  3076.                IBEG = J
  3077.                IEND = N
  3078.             END IF
  3079.             DO 30 I = 1, IBEG - 1
  3080.                IF( AA( I, J ).NE.AS( I, J ) )
  3081.      $            GO TO 70
  3082.    30       CONTINUE
  3083.             DO 40 I = IEND + 1, LDA
  3084.                IF( AA( I, J ).NE.AS( I, J ) )
  3085.      $            GO TO 70
  3086.    40       CONTINUE
  3087.    50    CONTINUE
  3088.       END IF
  3089. *
  3090.    60 CONTINUE
  3091.       LZERES = .TRUE.
  3092.       GO TO 80
  3093.    70 CONTINUE
  3094.       LZERES = .FALSE.
  3095.    80 RETURN
  3096. *
  3097. *     End of LZERES.
  3098. *
  3099.       END
  3100.       COMPLEX*16 FUNCTION ZBEG( RESET )
  3101. *
  3102. *  Generates complex numbers as pairs of random numbers uniformly
  3103. *  distributed between -0.5 and 0.5.
  3104. *
  3105. *  Auxiliary routine for test program for Level 2 Blas.
  3106. *
  3107. *  -- Written on 10-August-1987.
  3108. *     Richard Hanson, Sandia National Labs.
  3109. *     Jeremy Du Croz, NAG Central Office.
  3110. *
  3111. *     .. Scalar Arguments ..
  3112.       LOGICAL            RESET
  3113. *     .. Local Scalars ..
  3114.       INTEGER            I, IC, J, MI, MJ
  3115. *     .. Save statement ..
  3116.       SAVE               I, IC, J, MI, MJ
  3117. *     .. Intrinsic Functions ..
  3118.       INTRINSIC          DCMPLX
  3119. *     .. Executable Statements ..
  3120.       IF( RESET )THEN
  3121. *        Initialize local variables.
  3122.          MI = 891
  3123.          MJ = 457
  3124.          I = 7
  3125.          J = 7
  3126.          IC = 0
  3127.          RESET = .FALSE.
  3128.       END IF
  3129. *
  3130. *     The sequence of values of I or J is bounded between 1 and 999.
  3131. *     If initial I or J = 1,2,3,6,7 or 9, the period will be 50.
  3132. *     If initial I or J = 4 or 8, the period will be 25.
  3133. *     If initial I or J = 5, the period will be 10.
  3134. *     IC is used to break up the period by skipping 1 value of I or J
  3135. *     in 6.
  3136. *
  3137.       IC = IC + 1
  3138.    10 I = I*MI
  3139.       J = J*MJ
  3140.       I = I - 1000*( I/1000 )
  3141.       J = J - 1000*( J/1000 )
  3142.       IF( IC.GE.5 )THEN
  3143.          IC = 0
  3144.          GO TO 10
  3145.       END IF
  3146.       ZBEG = DCMPLX( ( I - 500 )/1001.0D0, ( J - 500 )/1001.0D0 )
  3147.       RETURN
  3148. *
  3149. *     End of ZBEG.
  3150. *
  3151.       END
  3152.       DOUBLE PRECISION FUNCTION DDIFF( X, Y )
  3153. *
  3154. *  Auxiliary routine for test program for Level 2 Blas.
  3155. *
  3156. *  -- Written on 10-August-1987.
  3157. *     Richard Hanson, Sandia National Labs.
  3158. *
  3159. *     .. Scalar Arguments ..
  3160.       DOUBLE PRECISION   X, Y
  3161. *     .. Executable Statements ..
  3162.       DDIFF = X - Y
  3163.       RETURN
  3164. *
  3165. *     End of DDIFF.
  3166. *
  3167.       END
  3168.       SUBROUTINE CHKXER( SRNAMT, INFOT, NOUT, LERR, OK )
  3169. *
  3170. *  Tests whether XERBLA has detected an error when it should.
  3171. *
  3172. *  Auxiliary routine for test program for Level 2 Blas.
  3173. *
  3174. *  -- Written on 10-August-1987.
  3175. *     Richard Hanson, Sandia National Labs.
  3176. *     Jeremy Du Croz, NAG Central Office.
  3177. *
  3178. *     .. Scalar Arguments ..
  3179.       INTEGER            INFOT, NOUT
  3180.       LOGICAL            LERR, OK
  3181.       CHARACTER*6        SRNAMT
  3182. *     .. Executable Statements ..
  3183.       IF( .NOT.LERR )THEN
  3184.          WRITE( NOUT, FMT = 9999 )INFOT, SRNAMT
  3185.          OK = .FALSE.
  3186.       END IF
  3187.       LERR = .FALSE.
  3188.       RETURN
  3189. *
  3190.  9999 FORMAT( ' ***** ILLEGAL VALUE OF PARAMETER NUMBER ', I2, ' NOT D',
  3191.      $      'ETECTED BY ', A6, ' *****' )
  3192. *
  3193. *     End of CHKXER.
  3194. *
  3195.       END
  3196.       SUBROUTINE XERBLA( SRNAME, INFO )
  3197. *
  3198. *  This is a special version of XERBLA to be used only as part of
  3199. *  the test program for testing error exits from the Level 2 BLAS
  3200. *  routines.
  3201. *
  3202. *  XERBLA  is an error handler for the Level 2 BLAS routines.
  3203. *
  3204. *  It is called by the Level 2 BLAS routines if an input parameter is
  3205. *  invalid.
  3206. *
  3207. *  Auxiliary routine for test program for Level 2 Blas.
  3208. *
  3209. *  -- Written on 10-August-1987.
  3210. *     Richard Hanson, Sandia National Labs.
  3211. *     Jeremy Du Croz, NAG Central Office.
  3212. *
  3213. *     .. Scalar Arguments ..
  3214.       INTEGER            INFO
  3215.       CHARACTER*6        SRNAME
  3216. *     .. Scalars in Common ..
  3217.       INTEGER            INFOT, NOUT
  3218.       LOGICAL            LERR, OK
  3219.       CHARACTER*6        SRNAMT
  3220. *     .. Common blocks ..
  3221.       COMMON             /INFOC/INFOT, NOUT, OK, LERR
  3222.       COMMON             /SRNAMC/SRNAMT
  3223. *     .. Executable Statements ..
  3224.       LERR = .TRUE.
  3225.       IF( INFO.NE.INFOT )THEN
  3226.          IF( INFOT.NE.0 )THEN
  3227.             WRITE( NOUT, FMT = 9999 )INFO, INFOT
  3228.          ELSE
  3229.             WRITE( NOUT, FMT = 9997 )INFO
  3230.          END IF
  3231.          OK = .FALSE.
  3232.       END IF
  3233.       IF( SRNAME.NE.SRNAMT )THEN
  3234.          WRITE( NOUT, FMT = 9998 )SRNAME, SRNAMT
  3235.          OK = .FALSE.
  3236.       END IF
  3237.       RETURN
  3238. *
  3239.  9999 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6, ' INSTEAD',
  3240.      $      ' OF ', I2, ' *******' )
  3241.  9998 FORMAT( ' ******* XERBLA WAS CALLED WITH SRNAME = ', A6, ' INSTE',
  3242.      $      'AD OF ', A6, ' *******' )
  3243.  9997 FORMAT( ' ******* XERBLA WAS CALLED WITH INFO = ', I6,
  3244.      $      ' *******' )
  3245. *
  3246. *     End of XERBLA
  3247. *
  3248.       END
  3249.  
  3250.